ORACLE regexp_substr извлечь все после определенного символа - PullRequest
0 голосов
/ 26 октября 2018

Как получить остаток строки после определенного символа?

У меня есть строка 'a|b|c|2|:x80|3|rr|', и я хотел бы получить результат после 3-го появления |. Таким образом, результат должен быть как 2|:x80|3|rr|

Запрос

select REGEXP_SUBSTR('a|b|c|2|:x80|3|rr|','[^|]+$',1,4) 
from dual

вернул мне NULL

Ответы [ 5 ]

0 голосов
/ 12 января 2019

Erkko, вам нужно использовать комбинацию SUBSTR и REGEXP_INSTR ИЛИ INSTR.

Ваш запрос будет выглядеть так.(Без регулярных выражений)
SELECT SUBSTR('a|b|c|2|:x80|3|rr|',INSTR('a|b|c|2|:x80|3|rr|','|',1,3)+1) from dual;

Ваш запрос будет выглядеть следующим образом.(С помощью Regex, который вы хотите использовать) SELECT SUBSTR('a|b|c|2|:x80|3|rr|',REGEXP_INSTR('a|b|c|2|:x80|3|rr|','\|',1,3)+1) from dual;

Объяснение:

Сначала вам нужно найти место строки, которую вы хотите, как вы упомянули.Таким образом, в вашем случае | находится на 6-м месте, так что +1 будет вашей позицией для начала подстроки.

Во-вторых, от исходной строки, подстрока из этой позиции + 1 до неограниченной. (Где вашконец строки)

Пример:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=6fd782db95f575201eded084493232ee

0 голосов
/ 26 октября 2018

Если вы используете oracle 11g и выше, вы можете указать подвыражение для возврата следующим образом:

select REGEXP_SUBSTR('a|b|c|2|:x80|3|rr|','([^|]+\|){3}(.+)$',1,1,null,2) from dual
0 голосов
/ 26 октября 2018

Я предлагаю долгую жизнь, используя regexp_substr, regexp_count и listagg вместе как:

select listagg(str) within group (order by lvl) 
       as "Result String"
  from
(
  with t(str) as
  (
   select 'a|b|c|2|:x80|3|rr|' from dual
  )
  select level-1 as lvl,
         regexp_substr(str,'(.*?)(\||$)',1,level) as str 
    from dual
    cross join t
   connect by level <= regexp_count('a|b|c|2|:x80|3|rr|','\|')
)
where lvl >= 3;

Rextester Demo

0 голосов
/ 26 октября 2018

REGEXP_REPLACE() сделает свое дело.Пропустите 3 группы чего-либо, за которым следует труба, затем замените на 2-ю группу, которая является остальной частью линии (привязанной к концу).

SQL> select regexp_replace('a|b|c|2|:x80|3|rr|', '(.*?\|){3}(.*)$', '\2') trimmed
  2  from dual;

TRIMMED
------------
2|:x80|3|rr|

SQL>
0 голосов
/ 26 октября 2018

Использование SUBSTR / INSTR комбинация

WITH t ( s ) AS (
     SELECT 'a|b|c|2|:x80|3|rr|'
     FROM dual
) SELECT substr(s,instr(s,'|',1,3) + 1)
  FROM t;

Демо

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