Подтвердить что ты не робот

Получить строку с правой стороны

Я пишу запрос в Oracle.

Я хочу получить строку с правой стороны, но длина строки является динамической.

Пример:

299123456789

Я хочу получить 123456789

substr(PHONE_NUMBERS,-X,Y)

X для каждой записи отличается.

Я пробовал это:

substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)

и это не сработало.

Как я могу написать этот запрос?

4b9b3361

Ответ 1

Если вы хотите перечислить последние 3 символа, самый простой способ -

 select substr('123456',-3) from dual;

Ответ 2

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

Надеюсь, это поможет вам

Ответ 3

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 символов слева от конца, либо начала строки.

Ответ 4

Я только узнал, что regexp_substr() идеально подходит для этой цели:)

Моя задача - выбрать правые 16 символов из справочной строки, которая теоретически может быть от 7 до 250 символов. Меня раздражает, что substr( OurReference , -16 ) возвращает null, когда length( OurReference ) < 16. (С другой стороны, это также логично, что Oracle, следовательно, возвращает null всякий раз, когда вызов substr() выходит за границы строки.) Однако я могу установить регулярное выражение для распознавания всего между 1 и 16 из любого char прямо перед концом строки:

regexp_substr( OurReference , '.{1,16}$' )

Когда речь идет о проблемах с производительностью в отношении регулярных выражений, я не могу сказать, какое из решений GREATER() и это лучше всего работает. Кто-нибудь проверяет это? Обычно я испытывал, что регулярные выражения довольно быстры, если они написаны аккуратно и хорошо (как этот).

Удачи!:)

Ответ 5

substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)

Ответ 6

шаблон может выглядеть следующим образом:

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:)

Ответ 7

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

Ответ 8

- У той же проблемы... это сработало для меня

CASE WHEN length (sp.tele_phone_number) = 10 THEN                  SUBSTR (sp.tele_phone_number, 4)

Ответ 9

Самое простое решение:

substr('299123456',-6,6)