Clob列を持つテーブルがあります。 CLOB列のコンテンツに基づいた検索を実行する必要があります。しかしながら
select * from aTable where aClobColumn = 'value';
失敗するが
select * from aTable where aClobColumn like 'value';
うまくいくようです。 Oracleはclob列のフィルタリングをどのように処理しますか。 =、!=などではなく、 'like'句のみをサポートしていますか?mysql、postgresなどの他のデータベースでも同じですか?
また、このシナリオはhibernateのようなJPAを実装するフレームワークでどのように処理されますか?
はい、SQLで_=
_、_!=
_、_<>
_などの比較演算子を使用することは許可されていません(この制限はPL/SQLのCLOB
s比較に影響しません) 2つのCLOB
列またはCLOB
列と文字リテラルを比較しようとするときのステートメント。 SQLステートメントでこのような比較を行うには、 dbms_lob.compare() 関数を使用できます。
_ select *
from aTable
where dbms_lob.compare(aClobColumn, 'value') = 0
_
上記のクエリでは、_'value'
_リテラルはCLOB
データ型に暗黙的に変換されます。暗黙的な変換を回避するために、TO_CLOB()
関数を使用して_'value'
_リテラルをCLOB
データ型に明示的に変換し、compare()
関数に渡すことができます。
_ select *
from aTable
where dbms_lob.compare(aClobColumn, to_clob('value')) = 0
_
どう?
select * from table_name where to_char(clob_column) ="test_string"
Clobは大量のデータを格納できる大きなデータ型であるため、varchar操作をサポートする多くの演算子はClobで機能しませんが、PL/SQLの一部はここで説明したように動作します。 http://docs.Oracle.com/ cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm#g1016221
表からわかるように、Like
はsqlとclobのpl/sqlの両方でサポートされていますが、=
はSQLではサポートされていませんが、pl/sqlではサポートされています
本当に必要な場合は、SQLでvarcharに変換し、Tom Kyteが言及しているように比較することができます here このように http://sqlfiddle.com/#!4/1878f6/1 =
select * from aTable where dbms_lob.substr( aClobColumn , length(aClobColumn), 1 )='value';
そうしないでください。データを比較したい場合-1つの値:NULL
と2番目のEMPTY_CLOB
そして、それはこの方法のための別の問題です!データの観点では-1を返します-両方の値が含まれてはいけません。正しいでしょう:
dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob ()), NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob ()))