【发布时间】:2017-10-16 22:16:03
【问题描述】:
目前我有此代码to_char(CLOB_COLUM) like %s 的查询,但以下不适用于非常大的 clob。是否有另一种解决方案来检查此列是否包含某些字符串。使用 oracle 11.2.0.4.0
【问题讨论】:
目前我有此代码to_char(CLOB_COLUM) like %s 的查询,但以下不适用于非常大的 clob。是否有另一种解决方案来检查此列是否包含某些字符串。使用 oracle 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%';
【讨论】:
DBMS_LOB.INSTR() 的文档。如果找不到模式,它会告诉您返回值,您可以将其用作过滤器,而不是 > 0 用于找到模式的时间。
基于 MT0 的回答。我测试哪种方式有效。
CLOB Column 长度为 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 针对 WHERE clob_column LIKE '%string to match%' 返回了 ORA-22835(缓冲区太小),那么您应该应用一些变通方法。
DBMS_LOB.instr 和 DBMS_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
【讨论】: