我的 Oracle 表中有一个 CLOB 字段,并且想要提取与模式“RES_GetResData_Public_ScreenPrint”匹配的所有出现的字符串。
**示例 - **
|RES_GetResData_Public_ScreenPrint011| |RES_GetResData_Public_ScreenPrint023| |RES_GetResData_Public_ScreenPrint086| |RES_GetResData_Public_ScreenPrint100|
我使用下面的查询来获取上述示例的 CLOB 数据中出现的所有字符串“RES_GetResData_Public_ScreenPrint”。该查询能够获取所有 4 次出现,但仅显示该字符串在所有 4 行中第一次出现的情况。
查询-
选择 objectid,REGEXP_SUBSTR(DATA, 'RES_GetResData_Public_ScreenPrint[^|]+', 1,1) column1 from perftest.NRS_DATASOURCEDATA_A_Test cross joinable(cast(multiset(按级别从双连接中选择级别 <= regexp_count(DATA, 'RES_GetResData_Public_ScreenPrint') ) as sys.odcinumberlist))
实际结果 -
对象ID | 第1栏 |
---|---|
12345 | RES_GetResData_Public_ScreenPrint011 |
12345 | RES_GetResData_Public_ScreenPrint011 |
12345 | RES_GetResData_Public_ScreenPrint011 |
12345 | RES_GetResData_Public_ScreenPrint011 |
预期结果 -
对象ID | 第1栏 |
---|---|
12345 | RES_GetResData_Public_ScreenPrint011 |
12345 | RES_GetResData_Public_ScreenPrint023 |
12345 | RES_GetResData_Public_ScreenPrint086 |
12345 | RES_GetResData_Public_ScreenPrint100 |
我认为您遗漏了一些查询?但问题是 regexp_substr 中的第二个“1”。这是文档中对第四个参数的描述:
occurrence 是一个正整数,指示 Oracle 应在 source_char 中搜索模式的哪一次出现。默认值为 1,表示 Oracle 搜索第一次出现的模式。
因此 regexp_count 找到了 4 个实例,但每次 regexp_substr 都得到第一个实例。您需要将其从
1
更改为 level
,因此 regexp_substr 会在每行中查找与 regexp_count 相同的出现次数。
如果没有查询的其余部分,我不能肯定地说,但我认为
level
可能通过 table/cast/multiset 语句重新别名为 column_value
,所以我认为这可能就是您想要的。
select objectid,
REGEXP_SUBSTR(DATA, 'RES_GetResData_Public_ScreenPrint[^|]+', 1,column_value) column1
from test_table
cross join
table(cast(multiset(select level from dual
connect by level <= regexp_count(DATA, 'RES_GetResData_Public_ScreenPrint')
... more query, probably? maybe just ")))" ...
作为旁注,您可以将表/转换/多重集重写为更简单的内联视图 - 参见这个问题。