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

0lvr5msh  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(122)

我在我的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行中字符串的第一个匹配项。

查询-
select objectid,
REGEXP_SUBSTR(DATA,'RES_GetResData_Public_ScreenPrint[^|]+',1,1)来自perftest.NRS_DATASOURCEDATA_A_Test交叉连接表的column
 1(转换(多集(
按级别<= regexp_count(DATA,'RES_GetResData_Public_ScreenPrint ')从双重连接中选择级别
)为sys.odcinumberlist))
实际结果-

| objectID| column1|
| --|--|
| 12345 |RES_GetResData_Public_ScreenPrint011|
| 12345 |RES_GetResData_Public_ScreenPrint011|
| 12345 |RES_GetResData_Public_ScreenPrint011|
| 12345 |RES_GetResData_Public_ScreenPrint011|

预期结果-

| objectID| column1|
| --|--|
| 12345 |RES_GetResData_Public_ScreenPrint011|
| 12345 |RES_GetResData_Public_ScreenPrint023|
| 12345 |RES_GetResData_Public_ScreenPrint086|
| 12345 |RES_GetResData_Public_ScreenPrint100|

r6vfmomb

r6vfmomb1#

我想你错过了一些你的问题?但问题是regexp_substr中的第二个“1”。下面是第四个arg from the docs的描述:
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 ")))" ...

顺便说一下,你可以将table/cast/multiset重写为一个更简单的内联视图-see this question

  • 编辑--
    好吧,听起来你的clob实际上是结构化数据。如果你知道每行有3个字段,像这样:
    | RES_GetResData_Public_ScreenPrintXXX| F9999999|(空白)|
    | --|--|--|
    那么从交叉连接返回的column_value基本上就是行号。您的column 2 regexp_substr现在只是查找任何字段-因此,如果您想要第二列,它将是(行号)*(列数)+(您想要的列,即2)。换句话说:
    (column_value-1)*3+2将给予第2列。如果你想要第3列,就把2改成3。
    如果您的数据实际上有4列,则需要将3更改为4。
select objectid, 
    REGEXP_SUBSTR(DATA, 'RES_GetResData_Public_ScreenPrint[^\|]+', 1,column_value) column1, 
    REGEXP_SUBSTR(DATA, '([^\|]+)', 1, (column_value-1)*3+2) AS column2,
    column_value 
from test_table 
cross join 
    table(cast(multiset(select level from dual connect by level <= regexp_count(DATA, 'RES_GetResData_Public_ScreenPrint') ) as sys.odcinumberlist))

相关问题