检查clob是否包含字符串oracle

6yt4nkrj  于 2023-03-07  发布在  Oracle
关注(0)|答案(4)|浏览(200)

目前我有查询这个代码to_char(CLOB_COLUM) like %s,但以下不工作非常大的clob.是否有另一种解决方案来检查此列是否包含一些字符串.使用oracle 11.2.0.4.0

qnzebej0

qnzebej01#

您可以使用DBMS_LOB.INSTR( clob_value, pattern [, offset [, occurrence]] )

SELECT *
FROM   your_table
WHERE  DBMS_LOB.INSTR( clob_column, 'string to match' ) > 0;

SELECT *
FROM   your_table
WHERE  clob_column LIKE '%string to match%';
2fjabf4q

2fjabf4q2#

根据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。

fnx2tebb

fnx2tebb3#

如果您想查看列的值,而Oracle返回WHERE clob_column LIKE '%string to match%'(缓冲区太小),那么您应该应用一些变通方法。
DBMS_LOB.instrDBMS_LOB.substr的组合可能是一个解决方案。例如,请参见this Stackoverflow tip。因此,在您的情况下:

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
ncecgwcz

ncecgwcz4#

使用DBMS_LOB.COMPARE()

SELECT *
FROM   your_table
WHERE  DBMS_LOB.COMPARE( clob_column, 'string to match' ) = 0;

返回值整数:如果比较成功则返回0,否则返回非零值。

相关问题