【发布时间】: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 ?