检查 clob 是否包含字符串 oracle

check if clob contains string oracle

目前我有关于此代码的查询 to_char(CLOB_COLUM) like %s 但以下代码不适用于非常大的 clob。是否有另一种解决方案来检查此列是否包含某些字符串。使用甲骨文 11.2.0.4.0

您可以使用 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%';

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

如果您想查看列的值和 WHERE clob_column LIKE '%string to match%' 的 Oracle returns ORA-22835(缓冲区太小),那么您应该应用一些解决方法。

DBMS_LOB.instrDBMS_LOB.substr 的组合可能是一个解决方案。参见例如this Whosebug 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