查询 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 中的CLOBs 比较) 尝试在 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字段的内容怎么办

oracle中怎样修改varchar2字段为clob字段

Oracle 在查询中使用 CLOB 获取 DISTINCT 数字

oracle中LOBSEGMENT类型存储的clob的内容过大,如何清除clob字段内容。释放表空间!

Oracle中如何查询CLOB字段类型的内容

Oracle查询CLOB字段类型的内容