получить строку с правой стороны - PullRequest
19 голосов
/ 09 августа 2010

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

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

Пример:

299123456789

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

substr(PHONE_NUMBERS,-X,Y)

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

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

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

и это не такt work ..

Как мне написать этот запрос?

Ответы [ 9 ]

38 голосов
/ 25 января 2014

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

 select substr('123456',-3) from dual;
16 голосов
/ 09 августа 2010
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 дает нулевое значение как -7> длина ('123456').

Так проверьте длину CONT_PHONE_NUMBERS и PHONE_NUMBERS

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

7 голосов
/ 09 августа 2010
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 голосов
/ 21 августа 2012

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

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

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

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

Удачи! :)

3 голосов
/ 12 декабря 2013
substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)
2 голосов
/ 13 февраля 2014

шаблон может выглядеть так:

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'

длина динамическая, вуаля:)

1 голос
/ 27 октября 2014
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

0 голосов
/ 05 декабря 2014

У меня была такая же проблема. Это сработало для меня:

 CASE WHEN length(sp.tele_phone_number) = 10 THEN
                   SUBSTR(sp.tele_phone_number,4)
0 голосов
/ 24 августа 2013

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

substr('299123456',-6,6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...