Ответ 1
Если вы хотите перечислить последние 3 символа, самый простой способ -
select substr('123456',-3) from dual;
Я пишу запрос в Oracle.
Я хочу получить строку с правой стороны, но длина строки является динамической.
Пример:
299123456789
Я хочу получить 123456789
substr(PHONE_NUMBERS,-X,Y)
X для каждой записи отличается.
Я пробовал это:
substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)
и это не сработало.
Как я могу написать этот запрос?
Если вы хотите перечислить последние 3 символа, самый простой способ -
select substr('123456',-3) from dual;
SQL> select substr('123456',-1,6) from dual;
S
-
6
SQL> select substr('123456',-6,6) from dual;
SUBSTR
------
123456
SQL> select substr('123456',-7,6) from dual;
S
-
Если вы смотрите вышеприведенные инструкции, запрос 3 дает значение null как -7 > length ('123456').
Итак, проверьте длину CONT_PHONE_NUMBERS
и PHONE_NUMBERS
Надеюсь, это поможет вам
SQL> select substr('999123456789', greatest (-9, -length('999123456789')), 9) as value from dual;
VALUE
---------
123456789
SQL> select substr('12345', greatest (-9, -length('12345')), 9) as value from dual;
VALUE
----
12345
Вызов greatest (-9, -length(string))
ограничивает начальное смещение либо 9 символов слева от конца, либо начала строки.
Я только узнал, что regexp_substr()
идеально подходит для этой цели:)
Моя задача - выбрать правые 16 символов из справочной строки, которая теоретически может быть от 7 до 250 символов. Меня раздражает, что substr( OurReference , -16 )
возвращает null
, когда length( OurReference ) < 16
. (С другой стороны, это также логично, что Oracle, следовательно, возвращает null
всякий раз, когда вызов substr()
выходит за границы строки.) Однако я могу установить регулярное выражение для распознавания всего между 1 и 16 из любого char прямо перед концом строки:
regexp_substr( OurReference , '.{1,16}$' )
Когда речь идет о проблемах с производительностью в отношении регулярных выражений, я не могу сказать, какое из решений GREATER()
и это лучше всего работает. Кто-нибудь проверяет это? Обычно я испытывал, что регулярные выражения довольно быстры, если они написаны аккуратно и хорошо (как этот).
Удачи!:)
substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)
шаблон может выглядеть следующим образом:
substr(STRING, ( length(STRING) - (TOTAL_GET_LENGTH - 1) ),TOTAL_GET_LENGTH)
в вашем случае это будет выглядеть так:
substr('299123456789', (length('299123456789')-(9 - 1)),9)
substr('299123456789', (12-8),9)
substr('299123456789', 4,9)
the result ? of course '123456789'
длина динамическая, voila:)
SELECT SUBSTR('299123456789',DECODE(least(LENGTH('299123456789'),9),9,-9,LENGTH('299123456789')*-1)) value from dual
Дает 123456789
Тот же оператор работает, даже если число меньше 9 цифр:
SELECT SUBSTR('6789',DECODE(least(LENGTH('6789'),9),9,-9,LENGTH('6789')*-1)) value from dual
Дает 6789
- У той же проблемы... это сработало для меня
CASE WHEN length (sp.tele_phone_number) = 10 THEN SUBSTR (sp.tele_phone_number, 4)
Самое простое решение:
substr('299123456',-6,6)