MySQL中CASE WHEN是条件判断语句,分简单式(匹配值)和搜索式(布尔条件),常用于SELECT字段映射、聚合统计、ORDER BY动态排序等,需注意类型一致、NULL显式判断及性能影响。

在 MySQL 中,CASE WHEN 是一种强大的条件判断语句,常用于查询中根据字段值动态返回不同结果,类似编程语言中的 if-else。它不改变数据本身,而是控制查询结果的输出形式。
基本语法结构
MySQL 支持两种 `CASE` 用法:
- 简单 CASE 表达式:比较一个表达式与多个可能值(类似 switch)
CASE column_name WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default_result END
- 搜索 CASE 表达式:基于布尔条件判断(更常用、更灵活)
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default_result END
注意:ELSE 可选,但强烈建议加上,避免 NULL 值干扰结果;每个 WHEN 后的条件按顺序执行,遇到第一个为 TRUE 的即返回对应结果,后续不再判断。
在 SELECT 中做字段映射(最常见用途)
比如将用户状态码转为中文描述:
SELECT
id,
name,
CASE status
WHEN 1 THEN '启用'
WHEN 0 THEN '禁用'
WHEN 2 THEN '待审核'
ELSE '未知状态'
END AS status_desc
FROM users;或用搜索式写法处理范围/复合条件:
SELECT
order_id,
amount,
CASE
WHEN amount > 1000 THEN '大单'
WHEN amount BETWEEN 200 AND 1000 THEN '中单'
WHEN amount > 0 THEN '小单'
ELSE '无效订单'
END AS order_level
FROM orders;配合聚合函数与 GROUP BY 使用
统计不同条件下的数量,替代多个子查询:
SELECT COUNT(*) AS total, COUNT(CASE WHEN status = 1 THEN 1 END) AS active_count, COUNT(CASE WHEN status = 0 THEN 1 END) AS inactive_count, AVG(CASE WHEN amount > 500 THEN amount END) AS avg_high_amount FROM users;
说明:`COUNT(CASE WHEN ... THEN 1 END)` 中,不满足条件时返回 NULL,而 COUNT() 忽略 NULL,因此只统计符合条件的行数。
在 ORDER BY 和 WHERE 中使用(进阶技巧)
ORDER BY 中动态排序:按优先级显示置顶内容
SELECT * FROM articles ORDER BY CASE is_top WHEN 1 THEN 0 ELSE 1 END, create_time DESC;
让 is_top = 1 的文章排在最前(用 0 排序靠前),其余按时间倒序。
WHERE 中简化复杂过滤(需谨慎):
SELECT * FROM products
WHERE
CASE
WHEN @user_role = 'admin' THEN 1
WHEN @user_role = 'seller' THEN category IN ('electronics', 'tools')
ELSE category = 'general'
END = 1;注意:这种写法可读性较低,多数场景推荐用逻辑运算符重写 WHERE 条件,仅在动态 SQL 或存储过程中权衡使用。
注意事项与避坑点
类型一致性:所有 THEN 和 ELSE 返回值应尽量同类型,否则 MySQL 会隐式转换,可能引发意外截断或精度丢失(如混合字符串和数字)。
NULL 判断要显式写:`column = NULL` 永远为 FALSE,正确写法是 `column IS NULL` 或在 CASE 中用 `WHEN column IS NULL THEN ...`
性能提示:`CASE WHEN` 本身不索引友好,若用于 WHERE 过滤大量数据,优先考虑改用普通条件 + 索引优化。










