我有一个带有clob列的表。需要执行基于clob列内容的搜索。但是
select * from aTable where aClobColumn = 'value';
失败,但
select * from aTable where aClobColumn like 'value';
似乎很有效。 oracle如何处理clob列上的过滤。它是否只支持'like'子句而不支持=,!=等。它与mysql,postgres等其他数据库是否相同
此外,在实现JPA的框架中如何处理这种情况,如hibernate?
答案 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 ()))