簡體   English   中英

查詢oracle clob列

[英]Querying oracle clob column

我有一張帶有clob柱的桌子。 需要執行基於clob列內容的搜索。 然而

select * from aTable where aClobColumn = 'value';

但失敗了

select * from aTable where aClobColumn like 'value';

似乎工作很精細。 oracle如何處理clob列上的過濾。 它是否只支持'like'子句而不支持=,!=等。它與其他數據庫如mysql,postgres等是否相同

另外,在實現JPA的框架中如何處理這種情況,如hibernate?

是的,當嘗試比較兩個CLOB列或CLOB列和一個CLOB列時,不允許(此限制不影響CLOB在PL / SQL中的比較)在SQL語句中使用比較運算符,如=!=<>等字符文字,就像你一樣。 為了能夠在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和比較像湯姆凱特提到這里是這樣的: http://sqlfiddle.com/#!4/1878f6/1

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

所以不要。 因為如果你想比較數據 - 那么它可能是一個值: NULL和第二個EMPTY_CLOB並且它對於這個方法不同的事情! 它返回-1,盡管就數據而言 - 兩個值都不應該包含。 這是正確的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM