如何使用case when_mysql条件判断语句

来源:这里教程网 时间:2026-02-28 20:48:22 作者:

在 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 过滤大量数据,优先考虑改用普通条件 + 索引优化。

相关推荐