从 DB2 中的列条目中查找多个子字符串
Find multiple substrings from a column entry in DB2
我有一个Table这样的
| 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
请试试这个:
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]+(?=\;)')
我手头没有 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]+)', '') -- Since 11.1
xmlcast(xmlquery('fn:replace($s, ".*? Name: ([^\s]+)", "")' passing T.DATA as "s") as varchar(100))
FROM TAB T;
我有一个Table这样的
| 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
请试试这个:
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]+(?=\;)')
我手头没有 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]+)', '') -- Since 11.1
xmlcast(xmlquery('fn:replace($s, ".*? Name: ([^\s]+)", "")' passing T.DATA as "s") as varchar(100))
FROM TAB T;