查询oracle clob列

时间:2013-08-15 09:37:22

标签: sql database oracle hibernate jpa

我有一个带有clob列的表。需要执行基于clob列内容的搜索。但是

select * from aTable where aClobColumn = 'value';

失败,但

select * from aTable where aClobColumn like 'value';

似乎很有效。 oracle如何处理clob列上的过滤。它是否只支持'like'子句而不支持=,!=等。它与mysql,postgres等其他数据库是否相同

此外,在实现JPA的框架中如何处理这种情况,如hibernate?

4 个答案:

答案 0 :(得分:37)

是的,这是不允许的(此限制不会影响PL / SQL中的CLOB比较) 在尝试时使用SQL语句中的=!=<>等比较运算符 比较两个CLOB列或CLOB列和一个字符文字,就像你一样。成为 能够在SQL语句中进行这样的比较,可以使用dbms_lob.compare()函数。

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

在上面的查询中,'value'文字将隐式转换为CLOB数据类型。 为避免隐式转换,'value'字面值可以显式转换为CLOB 数据类型使用TO_CLOB()函数,然后传入compare()函数:

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

答案 1 :(得分:7)

怎么样

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

答案 2 :(得分:2)

Clob是可以存储大量数据的大型数据类型,因此许多支持varchar操作的运算符不能用于Clob,但在PL / SQL中,其中一些操作如下所述:http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm#g1016221

正如您在表中看到的Like在Sql和pl / sql中都支持clobs,但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';

答案 3 :(得分:0)

所以不要。因为如果你想比较数据 - 那么可能是一个值:NULL和第二个EMPTY_CLOB的情况 并且这个方法不同的事情! 它返回-1,尽管就数据而言 - 两个值都不应该包含。 这是正确的:

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