web-dev-qa-db-ja.com

Oracle clob列のクエリ

Clob列を持つテーブルがあります。 CLOB列のコンテンツに基づいた検索を実行する必要があります。しかしながら

select * from aTable where aClobColumn = 'value';

失敗するが

select * from aTable where aClobColumn like 'value';

うまくいくようです。 Oracleはclob列のフィルタリングをどのように処理しますか。 =、!=などではなく、 'like'句のみをサポートしていますか?mysql、postgresなどの他のデータベースでも同じですか?

また、このシナリオはhibernateのようなJPAを実装するフレームワークでどのように処理されますか?

24
Dev Blanked

はい、SQLで_=_、_!=_、_<>_などの比較演算子を使用することは許可されていません(この制限はPL/SQLのCLOBs比較に影響しません) 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
_
37
Nick Krasnov

どう?

select * from table_name where to_char(clob_column) ="test_string"
6
Manish Puri

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';
2
Slartibartfast

そうしないでください。データを比較したい場合-1つの値:NULLと2番目のEMPTY_CLOBそして、それはこの方法のための別の問題です!データの観点では-1を返します-両方の値が含まれてはいけません。正しいでしょう:

dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob ()),  NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob ()))
0
Sergey