Найти длину и удалить первую букву

#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 чисел в идентификаторе». Но, если вы хотите применить только половину требований, вы получите правильный ответ в половине случаев.