Как найти каждый случай совпадения шаблона в строке и вернуть в виде строк - PullRequest
1 голос
/ 28 апреля 2019

Я пытаюсь определить ссылочные номера, содержащиеся в строках столбца. Таблица выглядит примерно так:

col1  col2
1     fgREF1234fhjdREF1235hgkjREF1236
2     hREF1237hjdfREF1238djhfhs

Необходимо написать запрос SQL, который идентифицирует 'REF', за которым следуют 4 цифры, и возвращает каждый в своей строке.

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

col1  ref
1     REF1234
1     REF1235
1     REF1236
2     REF1237
2     REF1238

Я пробовал:

select
    case when substr(substr(col2, instr(col2, 'REF'), 7), 1, 1) like 'R'
    then substr(col2, instr(col2, 'R'), 7) else null end ref
from table

... но это будет идентифицировать только первое совпадение в строке.

Я использую Oracle SQL, но в идеале решение можно было бы преобразовать в другие варианты SQL.

Любая помощь будет высоко ценится!

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Вы можете использовать regexp_substr с разделителями connect by level <= regexp_count(col2,'REF') ( время появления строки шаблона REF внутри строк col2)

with t(col1,col2) as
(
 select 1,'fgREF1234fhjdREF1235hgkjREF1236' from dual union all
 select 2,'hREF1237hjdfREF1238djhfhs' from dual
)   
select col1,
       regexp_substr(col2,'REF[0-9]+',1,level) as ref
  from t
connect by level <= regexp_count(col2,'REF') 
    and prior col1 = col1
    and prior sys_guid() is not null;

Демо

0 голосов
/ 28 апреля 2019

Вы можете использовать приведенный ниже код для получения желаемого результата: -

  select x.col1, explode(x.ref) as ref from (
  select col1,split(trim(regexp_replace(col2,'[^REF0-9]',' ')),'    ') as ref
  from inp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...