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?
Oui, il n'est pas autorisé (cette restriction n'affecte pas la comparaison de CLOB
s 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
que diriez-vous
select * from table_name where to_char(clob_column) ="test_string"
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';
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 ()))