Oracle 查询列出 CLOB 字段中出现的所有字符串

问题描述 投票:0回答:1

我的 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
regex oracle loops clob
1个回答
0
投票

我认为您遗漏了一些查询?但问题是 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 ")))" ...

作为旁注,您可以将表/转换/多重集重写为更简单的内联视图 - 参见这个问题

© www.soinside.com 2019 - 2024. All rights reserved.