【问题标题】:Blobs are not allowed in this expression此表达式中不允许使用 Blob
【发布时间】:2013-02-01 21:48:26
【问题描述】:

我面临以下问题:

-615:此表达式中不允许出现 Blob。

SELECT ser
      ,task_code
      ,trans_serial
      ,trans_year
      ,CASE when nvl(length(signed_content), 0) <> '' THEN  signed_content  ELSE  attach_content  END AS signed_content
      ,CASE WHEN nvl(length(signed_content), 0) <> '' THEN 'signed_content' ELSE 'attach_content' END AS comes_from
FROM attach_detail
WHERE serial = 5 AND task_code = 88 AND trans_year = 2012 AND trans_serial = 23728

注意:signed_contentattach_content 的类型为 BYTE;其他列的类型为INT

【问题讨论】:

  • 你能显示attach_detail表的定义吗?
  • 如果您运行 select nvl(length(signed_content),0) from attach_detail 是否也遇到同样的错误?
  • 您确定要将nvl(NULL, 0) 的结果与空字符串进行比较,而不是0
  • 这似乎是一个相当愚蠢的限制。来自finderr -615 的-615 扩展错误消息根本不涵盖实际情况。我为此创建了一个“功能请求”错误(CQ idsdb00247982),但我无法预测它是否会被修复,更不用说何时修复了。
  • 仅供参考:如果您使用 CLOB(或 BLOB)blob 而不是 TEXT(或 BYTE)blob,那么您可以在 UNION 等中使用它们。您可以对它们应用 NULLIF 或 NVL。但是,您不能在 CLOB 上使用 LENGTH。呻吟!

标签: sql blob informix


【解决方案1】:

您的问题似乎是 Informix 不允许在 CASE 表达式中使用 blob。

要解决此问题,您可以将 CASE 转换为两个子查询:

SELECT ser
      ,task_code
      ,trans_serial
      ,trans_year
      ,signed_content AS signed_content
      ,'signed_content' AS comes_from
FROM attach_detail
WHERE nvl(length(signed_content), 0) <> ''
  AND serial = 5 AND task_code = 88 AND trans_year = 2012 AND trans_serial = 23728
UNION ALL
SELECT ser
      ,task_code
      ,trans_serial
      ,trans_year
      ,attach_content AS signed_content
      ,'attach_content' AS comes_from
FROM attach_detail
WHERE nvl(length(signed_content), 0) = ''
  AND serial = 5 AND task_code = 88 AND trans_year = 2012 AND trans_serial = 23728

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2017-05-23
    • 2014-02-18
    • 2017-11-05
    相关资源
    最近更新 更多