#sql #oracle
#sql #Oracle
Вопрос:
Я новичок в SQL, и мне нужно знать, как узнать, какова длина идентификационного номера, и удалить первую букву, если идентификатор больше eq 16, поэтому у меня всего 15 чисел в id
SELECT DATE,
ID,
ADDRESS,
CITY,
Country
from myDb where DATE=TO_DATE('2020-10-31','yyyy-mm-dd') and ID=
(CASE when LENGTH(ID)=16 then LENGTH(ID)-1)
Комментарии:
1. Это не совсем понятно. Что, если идентификатор равен 17 цифрам — тогда вы удаляете только первую цифру и сохраняете 16 цифр? Или вам нужно удалить первые две цифры? Примеры хороши, но сами по себе примеры не являются полным требованием проблемы.
Ответ №1:
SELECT DATE,
CASE WHEN LENGTH(ID)=16 THEN SUBSTR(ID, 2, 15) ELSE ID END AS ID
ADDRESS,
CITY,
Country
FROM myDb
WHERE DATE=TO_DATE('2020-10-31','yyyy-mm-dd')
Комментарии:
1. В тексте вопроса говорится: «если идентификатор больше eq 16», поэтому вы можете захотеть использовать
>=
, а не просто=
.
Ответ №2:
Неясно, что вы хотите делать, если идентификатор превышает 16 символов. Однако я думаю, что самое простое решение просто:
select DATE, substr(ID, -15) as ID, ADDRESS, CITY, Country
from myDb
where DATE = DATE '2020-10-31';
substr()
Аргумент принимает аргумент с отрицательной позицией, начиная с этой позиции с конца строки. Вуаля! Именно то, что вы хотите сделать.
Единственное предостережение заключается в том, что длина может быть меньше 15. В этом случае он вернется NULL
, поэтому COALESCE()
решает эту проблему:
select DATE, coalesce(substr(ID, -15), id) as ID, ADDRESS, CITY, Country
from myDb
where DATE = DATE '2020-10-31';
Также обратите внимание, что Oracle принимает литералы даты, поэтому TO_DATE()
не требуется.
Комментарии:
1. В тексте вопроса говорится: «удалите первую букву, если идентификатор больше eq 16» поиск последних 15 символов — это не то же самое, что поиск со 2-го по 16-й символы, когда строка длиннее 16 символов.
2. @MT0 . , , В вопросе также говорится: «итак, у меня есть только 15 чисел в id».
3. Полные требования таковы: «удалите первую букву, если идентификатор больше eq 16, поэтому у меня есть только 15 чисел в идентификаторе». Но, если вы хотите применить только половину требований, вы получите правильный ответ в половине случаев.