web-dev-qa-db-ja.com

clobに文字列oracleが含まれているかどうかを確認します

現在、このコードto_char(CLOB_COLUM) like %sを使用したクエリがありますが、非常に大きなCLOBに対しては次のように動作しません。この列に文字列が含まれているかどうかを確認する別の解決策はありますか。 Oracle 11.2.0.4.0の使用

9
Master Yi

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%';
13
MT0

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  |

enter image description here

[〜#〜] instr [〜#〜]の平均時間は0.797です。

[〜#〜] like [〜#〜]の平均時間は0.823です。

2
alan9uo

列の値を確認したい場合、OracleがORA-22835に対してWHERE clob_column LIKE '%string to match%'(バッファが小さすぎる)を返す場合、いくつかの回避策を適用する必要があります。

DBMS_LOB.instrDBMS_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 
0
Srdjan