SQL中CASE WHEN按从上到下顺序逐条匹配,遇首个为TRUE的WHEN即返回对应THEN值并跳过后续分支;NULL需用IS NULL判断;顺序错误或缺ELSE易致逻辑异常。

SQL 中 CASE WHEN 的执行顺序是**从上到下、逐条匹配**,一旦某条 WHEN 条件为 TRUE,就立即返回对应的 THEN 结果,并**跳过后续所有分支**,包括后面的 WHEN 和 ELSE。
条件匹配是严格顺序的
数据库不会预先计算所有条件,也不会优化或重排 WHEN 子句。它按书写顺序依次判断:
- 先检查第一个 WHEN 后的表达式是否为真
- 如果为真,取对应 THEN 的值,整个 CASE 表达式结束
- 如果为假,继续检查下一个 WHEN
- 直到所有 WHEN 都不满足,才执行 ELSE(如果存在)
NULL 判断需显式处理
因为 NULL = NULL 返回 FALSE(不是 TRUE),所以用 WHEN column = NULL 永远不会命中。正确写法是:
WHEN column IS NULL- 或在开头加一个专门处理 NULL 的分支:
WHEN column IS NULL THEN '未知'
常见陷阱:顺序颠倒导致逻辑错误
例如想分类年龄,但把范围写反了:
- ❌ 错误写法(永远进不了第二个分支):
CASE WHEN age >= 18 THEN '成人' WHEN age >= 0 THEN '未成年' END - ✅ 正确写法(从小到大或从大到小,不重叠且覆盖完整):
CASE WHEN age >= 18 THEN '成人' ELSE '未成年' END
或更严谨:CASE WHEN age >= 18 THEN '成人' WHEN age BETWEEN 0 AND 17 THEN '未成年' ELSE '年龄无效' END
没有匹配时返回 NULL
如果所有 WHEN 都不满足,且没有定义 ELSE,则整个 CASE 表达式结果为 NULL。这在聚合、连接或 WHERE 过滤中可能引发意外行为,建议显式加上 ELSE 分支兜底。










