所有受支持的 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 表达式,并随时调试每个(集合)。