2013-08-15 31 views
21

Ho una tabella con una colonna di clob. La ricerca basata sul contenuto della colonna clob deve essere eseguita. TuttaviaQuerying oracle clob column

select * from aTable where aClobColumn = 'value';

fallisce ma

select * from aTable where aClobColumn like 'value'; 

sembra workfine. In che modo Oracle gestisce il filtraggio su una colonna di clob. Supporta solo la clausola 'like' e non il =,! = Ecc. È lo stesso con altri database come mysql, postgres ecc.

Inoltre, come viene gestito questo scenario in framework che implementano JPA come ibernazione?

+0

Date un'occhiata a questo http://stackoverflow.com/questions/17649011/search-for-a-particular-string-in-oracle -clob-column – user75ponic

risposta

30

Sì, non è consentito (questa restrizione non riguarda CLOB s confronto in PL/SQL) di utilizzare gli operatori di confronto come =, !=, <> e così via nelle istruzioni SQL, quando si cerca per confrontare due CLOB colonne o colonna CLOB e un carattere letterale, come fai tu. Per essere in grado di eseguire tale confronto in istruzioni SQL, è possibile utilizzare la funzione dbms_lob.compare().

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

Nella query sopra, la letterale 'value' saranno implicitamente convertito nel tipo di dati CLOB. Per evitare conversione implicita, letterale 'value' può essere esplicitamente convertito nel tipo CLOB dati utilizzando TO_CLOB() funzione e poi passano in alla funzione compare():

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

è questo comportamento lo stesso con tutte le altre basi di dati come Postgres –

+0

@DevBlanked PostgreeSQl ha il tipo di dati 'TEXT' (non esiste' CLOB') e [consente] (http: //www.sqlfiddle com/#!1/193dd/5) si usano gli operatori di confronto per confrontare i valori di quel tipo di dati tra di loro o con una stringa letterale. –

+0

Attenzione che "Funzionalità con valori di input NULL o non validi per i parametri restituisce un valore NULL". Questo può essere significativo in alcuni casi. – Vadzim

1

clob sono ampie tipi di dati in grado di memorizzare i dati di massa e, quindi, molti operatori che supportano le operazioni varchar non funziona su Clob, ma in PL/SQL alcuni di loro, come accennato qui: http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm#g1016221

Come si può vedere in la tavola Like è supportato sia Sql e PL/SQL per CLOB, ma = non è supportato in SQL, ma è in PL/SQL

Se avete veramente bisogno di voi potrebbe convertire in varchar in SQL e confrontare come Tom Kyte menzioni here come questo: http://sqlfiddle.com/#!4/1878f6/1

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

Quindi non. Perché se vuoi confrontare i dati - allora potrebbe essere una situazione in cui un valore: NULL e il secondo EMPTY_CLOB Ed è per questo metodo diverso! Restituisce -1, sebbene in termini di dati - entrambi i valori non dovrebbero contenere. sarebbe corretto:

dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob()), NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob())) 
4

come su

select * from table_name where to_char(clob_column) ="test_string" 
+3

'TO_CHAR()' funziona solo per clob di lunghezza inferiore a 4000 caratteri. – wweicker