Sql 检查clob是否包含字符串oracle

Sql 检查clob是否包含字符串oracle,sql,oracle,clob,Sql,Oracle,Clob,目前,我有一个类似于%s的查询,该查询使用此代码到\u char(CLOB\u column),但是下面的代码不适用于非常大的CLOB。是否有其他解决方案来检查此列是否包含某些字符串。使用oracle 11.2.0.4.0,您可以使用: 或 基于MT0的答案。我测试哪种方法有效 CLOB列的长度为155018,搜索32长度的字符串 这是我的测验 | INSTR | LIKE | |:-------|------:| | 0.857 |0.539 | | 0.127 |0.179 |

目前,我有一个类似于%s的查询,该查询使用此代码
到\u char(CLOB\u column),但是下面的代码不适用于非常大的CLOB。是否有其他解决方案来检查此列是否包含某些字符串。使用oracle 11.2.0.4.0,您可以使用:


基于MT0的答案。我测试哪种方法有效

CLOB列的长度为155018,搜索32长度的字符串

这是我的测验

| INSTR  | LIKE  |
|:-------|------:|
| 0.857  |0.539  |
| 0.127  |0.179  |
| 1.635  |0.534  |
| 0.511  |0.818  |
| 0.429  |1.038  |
| 1.586  |0.772  |
| 0.461  |0.172  |
| 0.126  |1.379  |
| 1.068  |1.088  |
| 1.637  |1.169  |
| 0.5    |0.443  |
| 0.674  |0.432  |
| 1.201  |0.135  |
| 0.419  |2.057  |
| 0.731  |0.462  |
| 0.787  |1.956  |

INSTR的平均时间为0.797


LIKE的平均时间为0.823。

如果要查看列的值,并且Oracle为
返回
ORA-22835
(缓冲区太小),其中clob_列(如“%string to match%”
),则应该应用一些变通方法

DBMS\u LOB.instr
DBMS\u LOB.substr
的组合可能是一个解决方案。见例。因此,在你的情况下:

SELECT DBMS_LOB.substr(your_clob_column, DBMS_LOB.instr(your_clob_column,'string to match'), 1) AS Text
FROM your_table
WHERE DBMS_LOB.instr(your_clob_column, 'string to match') > 0 

第一个成功了,第二个不起作用了。我过去也尝试过这种方法,不知道为什么,但我认为第二个看起来只是第一个4000字符。请告诉我如何搜索clob中不存在的字符串?@user3384231请阅读答案中链接的
DBMS\u LOB.INSTR()
的文档。如果找不到模式,它会告诉您返回值,您可以将其用作过滤器,而不是
>0
,用于查找模式。@MT0:谢谢。当=0时,搜索未找到的模式。
| INSTR  | LIKE  |
|:-------|------:|
| 0.857  |0.539  |
| 0.127  |0.179  |
| 1.635  |0.534  |
| 0.511  |0.818  |
| 0.429  |1.038  |
| 1.586  |0.772  |
| 0.461  |0.172  |
| 0.126  |1.379  |
| 1.068  |1.088  |
| 1.637  |1.169  |
| 0.5    |0.443  |
| 0.674  |0.432  |
| 1.201  |0.135  |
| 0.419  |2.057  |
| 0.731  |0.462  |
| 0.787  |1.956  |
SELECT DBMS_LOB.substr(your_clob_column, DBMS_LOB.instr(your_clob_column,'string to match'), 1) AS Text
FROM your_table
WHERE DBMS_LOB.instr(your_clob_column, 'string to match') > 0