web-dev-qa-db-fra.com

Interrogation de la colonne Oracle Clob

J'ai une table avec une colonne clob. La recherche basée sur le contenu de la colonne clob doit être effectuée. toutefois

select * from aTable where aClobColumn = 'value';

échoue mais

select * from aTable where aClobColumn like 'value';

semble fonctionner correctement. Comment Oracle gère-t-il le filtrage sur une colonne Clob. Supporte-t-il uniquement la clause 'like' et non les =,! = Etc. Est-ce la même chose avec d'autres bases de données comme mysql, postgres, etc.

De plus, comment ce scénario est-il géré dans les cadres qui implémentent JPA comme la mise en veille prolongée?

24
Dev Blanked

Oui, il n'est pas autorisé (cette restriction n'affecte pas la comparaison de CLOBs en PL/SQL) d'utiliser des opérateurs de comparaison comme =, !=, <>, Etc. dans les instructions SQL, lorsque vous essayez de comparer deux colonnes CLOB ou colonne CLOB et un littéral de caractère, comme vous le faites. Pour pouvoir effectuer une telle comparaison dans des instructions SQL, la fonction dbms_lob.compare () peut être utilisée.

  select * 
    from aTable 
   where dbms_lob.compare(aClobColumn, 'value') = 0

Dans la requête ci-dessus, le littéral 'value' Sera implicitement converti en type de données CLOB. Pour éviter une conversion implicite, le littéral 'value' Peut être explicitement converti en type de données CLOB à l'aide de la fonction TO_CLOB() puis passer à la fonction compare() :

  select * 
    from aTable 
   where dbms_lob.compare(aClobColumn, to_clob('value')) = 0
37
Nick Krasnov

que diriez-vous

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

Les Clob sont de grands types de données qui peuvent stocker des données massives et donc de nombreux opérateurs qui prennent en charge les opérations varchar ne fonctionneront pas sur Clob, mais en PL/SQL certains d'entre eux aiment être mentionnés ici: http://docs.Oracle.com/ cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm # g1016221

Comme vous pouvez le voir dans le tableau Like est pris en charge dans Sql et pl/sql pour les clobs, mais = n'est pas pris en charge dans SQL, mais dans pl/sql

Si vous en avez vraiment besoin, vous pouvez convertir en varchar en sql et comparer comme le mentionne Tom Kyte ici comme ceci: http://sqlfiddle.com/#!4/1878f6/1 =

select * from aTable where dbms_lob.substr( aClobColumn , length(aClobColumn), 1 )='value';
2
Slartibartfast

Donc ne le fais pas. Parce que si vous voulez comparer les données - cela peut être une situation où une valeur: NULL et la seconde EMPTY_CLOB Et c'est pour cette méthode un sujet différent! Il renvoie -1, bien qu'en termes de données - les deux valeurs ne doivent pas contenir. Serait correct:

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