REGEX получает все подходящие шаблоны по SQL DB2 - PullRequest
0 голосов
/ 03 февраля 2020

все. Мне нужно извлечь из строки с помощью REGEX все, что соответствует шаблону "TTT \ d {3}"

Для строки в примере я хотел бы получить:

TTT108,TTT109,TTT111,TTT110

DB2 Я хотел бы использовать функцию REGEXP_REPLACE(str,'REGEX pattern', ',').

Количество совпадений может быть 0,1,2,3 ... в каждой строке.

Спасибо.

Пример:

TTT108(optional);TTT109(optional);TTT111(optional);TTT110optional);ENTITYLIST_2=(optional);ENTITYLIST_3=(optional);Containment_Status=(optional)

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Для любого количества токенов и версий Db2 до 11.1:

select id, listagg(tok, ',') str
from 
(
  values 
    (1, 'TTT108(optional);TTT109(optional);TTT111(optional);TTT110optional);ENTITYLIST_2=(optional);ENTITYLIST_3=(optional);Containment_Status=(optional)')
) mytable (id, str)
, xmltable
(
'for $id in tokenize($s, ";") let $new := replace($id, "(TTT\d{3}).*", "$1") where matches($id, "(TTT\d{3}).*") return <i>{string($new)}</i>' 
passing mytable.str as "s"
columns tok varchar(6) path '.'
) t
group by id;
1 голос
/ 03 февраля 2020

Если вы хотите извлечь действительные вместо замены недопустимых символов, проверьте, поможет ли это:

with data (s) as (values
('TTT108(optional);TTT109(optional);TTT111(optional);TTT110optional);ENTITYLIST_2=(optional);ENTITYLIST_3=(optional);Containment_Status=(optional)')
)
select listagg(sst,', ') within group (order by n)
from (
select n,
       regexp_substr(s,'(TTT[0-9][0-9][0-9])', 1, n)
from   data
cross  join (values (1),(2),(3),(4),(5)) x (n) -- any numbers table
where  n <= regexp_count(s,'(TTT[0-9][0-9][0-9])')
) x (n,sst)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...