MySQL 中 case when的五种使用位置

发布日期 :2026-09-07 06:34:47 UTC

作者 :xuzhiping

访问量: 10 次浏览

CASE WHEN 属于条件表达式,本质是返回一个值,几乎可以放在 SQL 绝大部分区域,下面按使用场景逐一说明,附带可运行案例。

一、放在 SELECT 子句(最常用)

作用:查询结果里新增自定义条件列、字段值转换、分类打标签

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;

二、放在 WHERE 条件中

作用:动态筛选数据,根据条件灵活拼接筛选规则 示例:部门 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;

四、放在 ORDER BY 排序中

作用:自定义排序优先级,不按照字段原生数值排序 场景:优先把经理排最前面,普通员工次之

SELECT emp_name,job
FROM employees
ORDER BY
CASE job
    WHEN 'manager' THEN 1
    WHEN 'leader' THEN 2
    ELSE 3
END ASC;

五、放在 HAVING 分组后过滤

作用:对聚合之后的结果做条件筛选 示例:统计各部门人数,只保留人数较多的部门

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;

七、CASE WHEN 不能使用的地方

不能放在 FROM 里充当表(它是表达式,不是数据表)

不能用作表名、字段名(无法动态替换标识符)

不能替代 JOIN 关联条件