我正在使用下面的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替换'0'并且为空,没有运气。
答案 0 :(得分:4)
所有受支持的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和B,只包含示例查询中引用的列(A中的5列,B中的2列),并且完全按照我的建议运行,那么是否可以编译?
这是一个完整的查询序列,它完成了我在上一个要点中建议的内容,并且它(在一个已记录的数据库中 - 通过我的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:相应的数据类型必须在CASE表达式或DECODE 中兼容,因为在零周围的引号查询。所以,我将列更改为CHAR(3)。或者,我可以将'0'
更改为0
并保留INTEGER类型。
因此,显示的语法是正确的。您现在需要将其准确地应用于更复杂的表上的更大查询并修复任何其他残留问题。我可以推荐一种逐步改进的方法。注释掉查询中的所有CASE表达式,并使查询的其余部分在语法上正确。然后一次添加一个(或几个)CASE表达式,并在你去的时候调试每个(set)。