Informix 是不是支持 SELECT 查询中的 CASE 语句

Posted

技术标签:

【中文标题】Informix 是不是支持 SELECT 查询中的 CASE 语句【英文标题】:Does Informix support CASE statement inside a SELECT queryInformix 是否支持 SELECT 查询中的 CASE 语句 【发布时间】:2015-07-14 17:14:40 【问题描述】:

我正在使用下面的 SELECT 查询,如果我给出 CASE 语句,它就不起作用。如果 Informix 允许 CASE,或者如果选择查询中的语句,或者我在下面尝试的内容是否有任何其他替代方法,谁能告诉我?

select a.post_date, a.count_date,
    case 
        when (a.tover>b.sun_num) then a.tover 
        else '0' 
    end case as t_over,
    case 
        when (a.tshort>b.sun_num) then a.tover 
        else '0' 
    end case as t_short,
from a join b on a.cust_ix = b.cust_ix

我尝试用 0 和 null 替换 '0',没有运气。

【问题讨论】:

【参考方案1】:

所有受支持的 Informix 版本都在 SELECT 语句中支持 CASE。但是,它不使用END CASE,因为SQL 标准只需要END。示例查询还有一个杂散的逗号,这可能是一个最小化问题。

SELECT a.post_date, a.count_date,
       CASE WHEN (a.tover > b.sun_num) THEN a.tover ELSE '0' END CASE AS t_over,
       CASE WHEN (a.tshort > b.sun_num) THEN a.tover ELSE '0' END CASE AS t_short   -- , -- this comma in the original query is an error
  FROM a JOIN b ON a.cust_ix = b.cust_ix

正如评论中所讨论的,上述语法是正确的——任何残留问题都无法从问题中的可用信息中证明。

让我们从基础开始。

您使用的是哪个版本的 Informix 以及在哪个平台上? 当你说“它对我不起作用”时,它在什么方面不起作用? 什么是错误号/消息? 如果您只使用示例查询中引用的列(A 中的 5 列,B 中的 2 列)创建两个最小表 A 和 B,并完全按照我建议的答案运行,那么这是否可以编译?

这是一个完整的查询序列,它执行我在最后一个要点中的建议,并且它工作(在记录的数据库中 - 通过我的 SQLCMD 程序在 Mac OS X 10.10.4 上运行 Informix 11.70.FC6,但 DB-Access 会也可以):

BEGIN WORK;
CREATE TEMP TABLE a
(
    post_date   DATE NOT NULL,
    count_date  DATE NOT NULL,
    tover       CHAR(3) NOT NULL,
    tshort      CHAR(3) NOT NULL,
    cust_ix     INTEGER NOT NULL
);
CREATE TEMP TABLE b
(
    cust_ix     INTEGER NOT NULL,
    sun_num     CHAR(3) NOT NULL
);
SELECT a.post_date, a.count_date,
       CASE WHEN (a.tover  > b.sun_num) THEN a.tover ELSE '0' END AS t_over,
       CASE WHEN (a.tshort > b.sun_num) THEN a.tover ELSE '0' END AS t_short
  FROM a JOIN b ON a.cust_ix = b.cust_ix
  ;
ROLLBACK;

我想知道第二个CASE中的a.tover是否应该是t.short,但这是查询中的语义问题,而不是像我这样的局外人可以解决的句法问题。

我首先将三个 CHAR(3) 列创建为 INTEGER 列,但出现错误 -800: Corresponding data types must be compatible in CASE expression or DECODE 因为在查询。因此,我将列改为 CHAR(3)。或者,我可以将 '0' 更改为 0 并保留 INTEGER 类型。

所以,显示的语法是正确的。您现在需要将它准确地应用于更复杂表的更大查询并修复任何其他残留问题。我可以推荐一种逐步细化的方法。注释掉查询中的所有 CASE 表达式,并使查询的其余部分在语法上正确。然后一次添加一个(或几个)CASE 表达式,并随时调试每个(集合)。

【讨论】:

Jonathan,感谢您的回复,但是,我错过了编辑时的逗号,因为我在这里没有使用原始表名,并且有一些列将遵循 case 语句。我在结束后尝试了没有案例,它对我不起作用...... 好的;我认为杂散的逗号可能是最小化查询的结果。让我们从基础开始。您正在使用哪个版本的 Informix 以及在哪个平台上?当你说“它对我不起作用”时,它在什么方面不起作用?错误号/消息是什么?如果您仅使用示例查询中引用的列(A 中的 5 列,B 中的 2 列)创建两个最小表 A 和 B,并完全按照我建议的答案运行,那是否编译?引用的手册页是否显示我忽略了另一个语法问题? Jonathan - 感谢您的解释,它有帮助。这次我可以让它工作。我正在使用 CASE WHEN (a.tover > b.sun_num) THEN a.tover ELSE '0' END AS [total over] 导致问题。用 t_over 替换 [total over] 有效。非常感谢!

以上是关于Informix 是不是支持 SELECT 查询中的 CASE 语句的主要内容,如果未能解决你的问题,请参考以下文章

在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异

informix 14.10 如何“选择”返回一个特定的短语,如无或空白,而不是没有结果

informix SQL查询咨询

带有 FIRST 选项的 Informix 子查询

Informix - 两个日期之间

在 informix DB 中是不是定义了任何 alpha 逻辑