現在、このコード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%';
MT0の答えに基づいてください。どの方法が効率的かをテストします。
CLOB Columnの長さは155018であり、32 length文字列。
これが私のテストです。
| 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
に対してWHERE clob_column LIKE '%string to match%'
(バッファが小さすぎる)を返す場合、いくつかの回避策を適用する必要があります。
DBMS_LOB.instr
とDBMS_LOB.substr
の組み合わせが解決策になる可能性があります。例参照 このStackoverflowのヒント 。だから、あなたの場合:
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