查询 oracle clob 列
Posted
技术标签:
【中文标题】查询 oracle clob 列【英文标题】:Querying oracle clob column 【发布时间】:2013-08-17 11:37:59 【问题描述】:我有一个带有 clob 列的表。需要执行基于 clob 列内容的搜索。不过
select * from aTable where aClobColumn = 'value';
失败但
select * from aTable where aClobColumn like 'value';
似乎工作正常。 oracle 如何处理对 clob 列的过滤。它是否只支持'like'子句而不支持=,!=等。它与其他数据库如mysql,postgres等一样
此外,在实现 JPA(如 hibernate)的框架中如何处理这种情况?
【问题讨论】:
看看这个***.com/questions/17649011/… 【参考方案1】:是的,不允许(此限制不影响 PL/SQL 中的CLOB
s 比较)
尝试在 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
【讨论】:
这种行为是否与所有其他数据库(如 postgres)相同 @DevBlanked PostgreeSQl 有TEXT
(没有CLOB
)数据类型,allows 你使用比较运算符来比较该数据类型的值或字符串文字。
请注意“具有 NULL 或参数输入值无效的函数返回 NULL”。在某些情况下,这可能很重要。【参考方案2】:
所以不要。因为如果你想比较数据 - 那么它可能是一个值:NULL
和第二个 EMPTY_CLOB
而对于这种方法,情况就不同了!
它返回 -1,尽管就数据而言 - 两个值都不应该包含。
是正确的:
dbms_lob.compare (NVL (AUDIT_PAYLOAD_TEXT_DEC, Empty_Clob ()), NVL (AUDIT_PAYLOAD_TEXT, Empty_Clob ()))
【讨论】:
【参考方案3】:怎么样
select * from table_name where to_char(clob_column) ="test_string"
【讨论】:
TO_CHAR()
仅适用于长度小于 4000 个字符的 clob。【参考方案4】:
Clob 是可以存储大量数据的大型数据类型,因此许多支持 varchar 操作的运算符在 Clob 上不起作用,但在 PL/SQL 中,它们中的一些确实像这里提到的那样:http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_sql_semantics.htm#g1016221
正如您在表中看到的,对于 clob,Sql 和 pl/sql 都支持 Like
,但 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';
【讨论】:
以上是关于查询 oracle clob 列的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 在查询中使用 CLOB 获取 DISTINCT 数字