SQL CASE表达式始终返回ELSE默认0值无法命中条件问题
问题根因
你的第二段CASE判断存在两个语法逻辑错误,导致永远无法命中前两个分支:
- 同层级SELECT无法直接引用同层定义的别名:SQL执行顺序中SELECT子句的别名计算晚于WHERE、GROUP BY等阶段,同层级SELECT内的其他计算表达式不能直接引用刚定义的
I/S别名。 - 字符串常量和字段引用混淆:你在判断条件里写的
'I/S'是用单引号包裹的字符串字面量,代表固定文本"I/S",不是指代前面生成的计算字段,等价于执行'I/S' = 'Index'这类恒不成立的判断,自然永远走ELSE分支返回0。
另外你给别名加单引号的写法本身就不规范,SQL中单引号是字符串值的界定符,字段别名请用方括号、反引号或双引号包裹,避免解析歧义。
修复方案
你可以任选以下一种方式修改:
- 方案1:简化逻辑,直接基于原字段判断,无需嵌套重复CASE
,CASE WHEN [Contract] IN ('INIM','BANK') THEN 'Index' ELSE 'Single' END AS [I/S] ,CASE WHEN [Contract] IN ('INIM','BANK') THEN ([Quantity] * [Spot Price] * 10)/1000000 ELSE ([Quantity] * [Spot Price] * 100)/1000000 END AS [Notional (ZARm)]
这种写法最简洁,执行效率最高,适合你当前的简单判断场景。
- 方案2:用CTE/子查询提前计算第一层字段,外层再做二次计算
如果后续I/S字段还要被多个计算逻辑复用,推荐这种写法,逻辑更清晰易维护:
WITH base_data AS ( SELECT -- 这里写你原查询需要的其他字段 [Contract], [Quantity], [Spot Price], CASE WHEN [Contract] IN ('INIM','BANK') THEN 'Index' ELSE 'Single' END AS [I/S] FROM 你的业务表名 -- 这里可以加你原有的WHERE/JOIN等逻辑 ) SELECT -- 这里写你需要返回的其他字段 [I/S], CASE WHEN [I/S] = 'Index' THEN ([Quantity] * [Spot Price] * 10)/1000000 WHEN [I/S] = 'Single' THEN ([Quantity] * [Spot Price] * 100)/1000000 ELSE 0 END AS [Notional (ZARm)] FROM base_data
内容的提问来源于stack exchange,提问作者REF
相关产品推荐
相关产品推荐

