Oracle SQL для извлечения значений между двумя символами в списке - PullRequest
1 голос
/ 21 мая 2019

У меня есть список значений, таких как:

'aaa:data1!x,bbb:data2!y,cc:data3!z'

Мне нужно извлечь значения между ':' и '!' такие как data1 data2 data3

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

SELECT regexp_substr('aaa:data1!x,bbb:data2!y,cc:data3!z', 
                     '\:([^!]+)\!', 
                     1,
                     1,
                     NULL,
                     1) AS output
FROM dual;

Но он возвращает мне только data1

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вы на правильном пути, просто нужно отправить итерированные целые числа в 4-й аргумент regexp_substr function

Это дает вертикальный результат:

with t(str) as
(
 select 'aaa:data1!x,bbb:data2!y,cc:data3!z' from dual
) 
select regexp_substr(str,
                     ':([^!]+)',
                     1,
                     level,
                     null,
                     1) as output                     
  from t
 connect by level <= regexp_count(str,'!');

 OUTPUT
 ------
 data1
 data2
 data3

Это дает горизонтальныйрезультат:

with t(str) as
(
 select 'aaa:data1!x,bbb:data2!y,cc:data3!z' from dual
), t2 as
( 
 select regexp_substr(str,
                     ':([^!]+)',
                     1,
                     level,
                     null,
                     1) as output                     
   from t
 connect by level <= regexp_count(str,'!') 
)
select listagg(output,' ') within group (order by output) as output from t2  

 OUTPUT
 -----------------
 data1 data2 data3
1 голос
/ 21 мая 2019

Хорошо, старый SUBSTR + INSTR делает работу:

SQL> with test (col) as
  2    (select 'aaa:data1!x,bbb:data2!y,cc:data3!z' from dual)
  3  select substr(col, instr(col, ':', 1, level) + 1,
  4                     instr(col, '!', 1, level) - instr(col, ':', 1, level) - 1
  5               ) result
  6  from test
  7  connect by level <= regexp_count(col, ':');

RESULT
----------------------------------
data1
data2
data3

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