【问题标题】:DB2 : issue with a subquery that contains a cast operator on clob fieldDB2:在 clob 字段上包含强制转换运算符的子查询出现问题
【发布时间】:2014-06-15 02:59:02
【问题描述】:

我有一个问题,这个查询不起作用:

select count(*)
from MYTABLE where
MYFIELD in (select trim(cast(CLOBFIELD as varchar(20000))) from TABLE2) ;
=>0 rows

子查询返回正确的结果:

select trim(cast(CLOBFIELD as varchar(20000))) from TABLE2 ; 
=>1202,1203,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1226

这个没有子查询的查询返回正确的结果。

select count(*)
from MYTABLE where
MYFIELD in (1202,1203,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1226) ;

CLOBFIELD 列是 CLOB 字段 VS 列是 char(4) 字段。 在我看来,由于 clob 字段上的强制转换,这是子查询中的强制转换问题。我不知道怎么回事,我对 DB2 不是很熟悉,有人可以帮助我吗?

【问题讨论】:

  • 这实际上不是 DB2 问题,no RDBMS 本身就支持这一点。发生的事情是 db 仍然将子查询视为返回一个长字符串,这当然与任何 id 都不匹配。您需要动态 SQL 来解析以前的查询结果、要加载到的 SESSION 表、要为您扩展它的 UDF,或者可能需要基于确切平台的其他选项。 Here's a sample expanding function 为应该具有适应性的 SQL Server 编写。请注意,查询困难是您不应该这样存储数据的原因之一。
  • 您使用的是哪个 DB2 服务器?用于 IBM i、z/OS 或 LUW 的 DB2?

标签: sql casting db2 subquery


【解决方案1】:

正如上面的 cmets 所说,像这样乱扔大型数据类型是不对的,但这里有一些代码可以尝试:

select count(*)
from MYTABLE 
where LOCATE_IN_STRING((select ','||trim(cast(CLOBFIELD as varchar(20000)))||',' from TABLE2), ','||trim(MYFIELD)||','  ) > 0  ;

如果您的值包含逗号,则可能会出现问题。

也许您可以研究应用文本搜索索引? http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.ts.doc%2Fdoc%2Ft_creatingafulltextindex.html

但是,如果您需要访问 CLOB 中的值,也许它们不应该在 CLOB 中?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多