32

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

select * from aTable where aClobColumn = 'value';

失败但

select * from aTable where aClobColumn like 'value';

似乎工作正常。oracle 如何处理对 clob 列的过滤。它是否只支持'like'子句而不支持=,!=等。它与其他数据库如mysql,postgres等一样吗

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

4

4 回答 4

48

是的,当您尝试比较两列或列和字符文字时,不允许(此限制不影响CLOBPL/SQL 中的 s 比较)在 SQL 语句中使用比较运算符,如=,等。为了能够在 SQL 语句中进行这种比较,可以使用dbms_lob.compare()函数。!=<>CLOBCLOB

  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
于 2013-08-15T11:22:57.760 回答
9

怎么样

select * from table_name where to_char(clob_column) ="test_string"
于 2014-04-07T10:25:36.450 回答
2

Clob 是可以存储大量数据的大型数据类型,因此许多支持 varchar 操作的运算符不适用于 Clob,但在 PL/SQL 中,它们中的一些确实像这里提到的那样:http: //docs.oracle.com/cd/B19306_01/ appdev.102/b14249/adlob_sql_semantics.htm#g1016221

正如您在表中看到的,LikeSql 和 pl/sql 都支持 clob,但=在 SQL 中不支持,但在 pl/sql 中

如果你真的需要,你可以在 sql 中转换为 varchar 并像 Tom Kyte在这里提到的那样进行比较: http ://sqlfiddle.com/#!4/1878f6/1

select * from aTable where dbms_lob.substr( aClobColumn , length(aClobColumn), 1 )='value';
于 2013-08-15T10:51:51.780 回答
0

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

dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob ()),  NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob ()))
于 2013-11-12T13:39:38.560 回答