【问题标题】:Find multiple substrings from a column entry in DB2从 DB2 中的列条目中查找多个子字符串
【发布时间】:2020-07-13 08:19:20
【问题描述】:

我有一张这样的桌子

|   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

【问题讨论】:

  • 我不知道 db2,但是在 ms sql 或 oracle 中,我会编写一个存储过程或函数来执行此操作。你基本上想在循环中执行你的 substr 直到它返回一个空字符串。您还可以根据需要将字符串拆分为一个数组并循环遍历它。
  • 不幸的是,我只有 DB2 10.5。我认为您可以通过使用递归 CTE 并将 REGEXP_COUNT() 与 REGEXP_EXTRACT() 组合来获得所需的结果,在 11.1 中可用。
  • 你好 manish,你能解释一下你是如何检测名字的吗?它是 'Name: ' 和 ';' 之间的字符串(包括) !如果是这样,如果可能的话,您是否尝试在 DB2 上使用 Regex ?

标签: sql database db2 db2-luw


【解决方案1】:

我手头没有 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;

【讨论】:

  • 嘿,马克,谢谢它的工作,但它不会删除姓氏之后的额外字符串。
【解决方案2】:

请试试这个:

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]+(?=\;)')

【讨论】:

  • 不支持正则表达式
  • 您的确切 Db2 平台和版本是什么?
  • 嗨,马克,我正在使用 DB2 - LUW v9.7
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多