You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL CASE表达式始终返回ELSE默认0值无法命中条件问题

问题根因

你的第二段CASE判断存在两个语法逻辑错误,导致永远无法命中前两个分支:

  1. 同层级SELECT无法直接引用同层定义的别名:SQL执行顺序中SELECT子句的别名计算晚于WHERE、GROUP BY等阶段,同层级SELECT内的其他计算表达式不能直接引用刚定义的I/S别名。
  2. 字符串常量和字段引用混淆:你在判断条件里写的'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:45:59