Найти несколько подстрок из записи столбца в DB2 - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть такая таблица

|   ID   |  otherID  | Data
+--------+-----------+----------------
|  1234  |   56789   | This is a Name: Charlie; string <name_starts> with Name: Alpha; also some more data and Name: Bravo;

здесь в последнем столбце есть строка, и мне нужны эти имена из нее (может быть много имен), поэтому вывод должен выглядеть следующим образом

|   Name   
+------------------
|  Alpha;Bravo;

Я написал следующий запрос, который может получить имя, но мне нужны все имена, и неизвестно, сколько там имен

select substr(Data, locate('Name',Data)+6, locate(':',Data)-locate(':',Data)-6) from myTable

РЕДАКТИРОВАТЬ: Извините, что пропустил пункт что мне нужно взять все имена, которые встречаются после "name_starts", перед этим, если они есть, мне нужно их игнорировать. Извините, что пропустил это при публикации.

Также я использую DB2-LUW v9.7

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

У меня нет 10.5 под рукой, но работает на 11.1:

WITH TAB (DATA) AS 
(
VALUES
  'This is a string with Name: Alpha; also some more data and Name: Bravo;'
)
SELECT 
--REGEXP_REPLACE(T.DATA, '.*? Name: ([^\s]+)', '$1') -- Since 11.1
xmlcast(xmlquery('fn:replace($s, ".*? Name: ([^\s]+)", "$1")' passing T.DATA as "s") as varchar(100))
FROM TAB T;
0 голосов
/ 01 апреля 2020

Пожалуйста, попробуйте это:

with data (s) as (values ('This is a string with Name: Alpha; also some more data and Name: Bravo;'))
select listagg(regexp_substr(s,'(?<=Name\: )[A-Za-z]+(?=\;)', 1, n),';')
from   data
cross  join (values (1),(2)) x (n)
where  n <= regexp_count(s,'(?<=Name\: )[A-Za-z]+(?=\;)')
...