我在我的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|
1条答案
按热度按时间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
,所以我认为这可能是您想要的。顺便说一下,你可以将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。