发布日期 :2026-09-07 06:34:47 UTC
作者 :xuzhiping
访问量: 10 次浏览
CASE WHEN 属于条件表达式,本质是返回一个值,几乎可以放在 SQL 绝大部分区域,下面按使用场景逐一说明,附带可运行案例。
作用:查询结果里新增自定义条件列、字段值转换、分类打标签
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 默认值
END 别名
简写(等值判断专用):
CASE 字段
WHEN 值1 THEN 结果1
ELSE ...
END
示例:员工薪资分级
SELECT
emp_name,
salary,
CASE
WHEN salary >= 15000 THEN '高薪'
WHEN salary >= 8000 THEN '中产'
ELSE '基础薪资'
END AS salary_level
FROM employees;
作用:动态筛选数据,根据条件灵活拼接筛选规则 示例:部门 10 只查高薪员工,其他部门查全部
SELECT emp_name,department_id,salary
FROM employees
WHERE
CASE department_id
WHEN 10 THEN salary >= 15000
ELSE 1=1 -- 恒成立,不做限制
END;
等价普通写法:
WHERE (department_id=10 AND salary>=15000) OR department_id<>10
GROUP BY 分组里作用:按照条件分类分组,不再依据原始字段分组 需求:把薪资划分档次,统计每个档次人数
SELECT
CASE
WHEN salary >= 15000 THEN '高薪'
WHEN salary >= 8000 THEN '中产'
ELSE '基础薪资'
END AS level,
COUNT(*) AS total
FROM employees
GROUP BY
CASE
WHEN salary >= 15000 THEN '高薪'
WHEN salary >= 8000 THEN '中产'
ELSE '基础薪资'
END;
小技巧:MySQL 支持 GROUP BY 别名
GROUP BY level;
作用:自定义排序优先级,不按照字段原生数值排序 场景:优先把经理排最前面,普通员工次之
SELECT emp_name,job
FROM employees
ORDER BY
CASE job
WHEN 'manager' THEN 1
WHEN 'leader' THEN 2
ELSE 3
END ASC;
作用:对聚合之后的结果做条件筛选 示例:统计各部门人数,只保留人数较多的部门
SELECT
department_id,
COUNT(*) cnt
FROM employees
GROUP BY department_id
HAVING
CASE
WHEN department_id IN (10,20) THEN cnt >= 3
ELSE cnt >= 1
END;
UPDATE 更新语句内作用:批量条件更新数据 需求:高薪涨薪 2000,中产涨 1000
UPDATE employees
SET salary = salary +
CASE
WHEN salary >= 15000 THEN 2000
WHEN salary >= 8000 THEN 1000
ELSE 500
END;
不能放在 FROM 里充当表(它是表达式,不是数据表)
不能用作表名、字段名(无法动态替换标识符)
不能替代 JOIN 关联条件