case表达式是sql中处理复杂条件逻辑的核心工具,支持嵌套、布尔组合、聚合嵌套及null显式处理,需注意优先级顺序、类型一致、括号完整和else必备。

SQL 中的 CASE 表达式是处理复杂条件逻辑的核心工具,它不只支持简单等值判断,还能嵌套、组合布尔逻辑、聚合计算和空值处理,关键在于结构清晰、优先级明确、避免歧义。
用 WHEN 子句串联多层业务规则
当需要按优先级依次匹配多个业务条件(如客户等级、订单状态、地域政策),应把高优先级规则放在前面,利用 CASE 的“从上到下逐条匹配、命中即止”特性。注意每个 WHEN 后的条件必须是独立布尔表达式,可自由使用 AND、OR、IS NULL、函数等。
- 例如:区分活跃用户时,优先看近7天登录,再看近30天下单,最后看注册时间
- 写法示例:CASE WHEN last_login >= CURRENT_DATE - INTERVAL '7 days' THEN '高活'
WHEN last_order >= CURRENT_DATE - INTERVAL '30 days' THEN '中活'
WHEN registered ELSE '新客' END
在聚合或窗口函数中嵌套 CASE 实现条件统计
直接对原始字段做 SUM 或 COUNT 往往不够,需按条件动态“开关”统计项。此时把 CASE 放在聚合函数内部,让其返回数值(如 1 / 0)或 NULL,再由外层函数处理。
- COUNT(CASE WHEN status = 'paid' THEN 1 END) 统计已支付订单数(忽略 NULL)
- SUM(CASE WHEN amount > 1000 THEN amount ELSE 0 END) 计算大额订单总金额
- 配合窗口函数:SUM(CASE WHEN region = 'CN' THEN sales ELSE 0 END) OVER (PARTITION BY year) 计算各年国内销售额累计
用 CASE 处理 NULL 和默认逻辑,避免隐式转换陷阱
数据库中 NULL 参与比较(如 =、>)永远返回 UNKNOWN,直接写 WHERE col = NULL 永远不成立。统一用 IS NULL 或 IS NOT NULL 判断,并在 CASE 中显式覆盖 NULL 分支。
- 错误写法:WHEN rating = NULL THEN '未知' → 永远不匹配
- 正确写法:WHEN rating IS NULL THEN '未知'
WHEN rating >= 4.5 THEN '优秀'
ELSE '一般' END - 若需将 NULL 视为 0 参与计算,可用 COALESCE(rating, 0) 预处理,或在 CASE 中直接转换
避免常见错误:括号、类型一致与 ELSE 必须存在
复杂条件容易漏括号导致逻辑错乱;不同分支返回值类型不一致会引发隐式转换或报错;省略 ELSE 会使未匹配行返回 NULL——这未必是预期结果。
- 嵌套 AND/OR 时加括号:WHEN (status = 'shipped' AND shipped_date
- 所有分支返回相同类型:数字分支统一用 0 / 1,字符串分支统一用 'Y' / 'N',避免混合返回 1 和 'true'
- 即使认为“所有情况都已覆盖”,也建议写 ELSE 'unexpected' 便于后期排查数据异常










