CASE WHEN
和 CASE xxx WHEN
是两种不同的条件表达式语法,它们的主要区别和适用场景如下:
1. 语法区别
a. 简单 CASE(CASE xxx WHEN
)
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
- 执行逻辑:先计算
expression
的值,然后依次与每个WHEN
后的value
进行等值比较(=
)。 - 示例:
CASE bapprove WHEN 1 THEN '已提交' WHEN 2 THEN '已通过' ELSE '其他' END
等价于:
bapprove = 1 ? '已提交' : (bapprove = 2 ? '已通过' : '其他')
b. 搜索 CASE(CASE WHEN
)
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
- 执行逻辑:依次判断每个
WHEN
后的condition
是否为真(TRUE
),并返回第一个为真的结果。 - 示例:
CASE WHEN bapprove = 1 THEN '已提交' WHEN bapprove = 2 AND created_at > '2023-01-01' THEN '已通过' ELSE '其他' END
- 可以使用更复杂的条件(如比较运算符、函数等)。
2. 核心差异
特性 | 简单 CASE (CASE xxx WHEN ) | 搜索 CASE (CASE WHEN ) |
---|---|---|
比较方式 | 仅支持等值比较(= ) | 支持任意条件表达式(如 > , < , LIKE ) |
性能 | 表达式只需计算一次,可能略快 | 每个条件都需单独计算 |
灵活性 | 只能针对单个表达式进行判断 | 可组合多个字段、函数进行复杂判断 |
常见错误 | CASE bapprove WHEN bapprove = 2 THEN ... | 无特殊陷阱 |
3. 适用场景
简单 CASE 的适用场景
-
等值转换:将枚举值映射为文本描述。
SELECT user_id, CASE gender WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END AS gender_text FROM users;
-
简化多条件等值判断:避免重复书写同一字段。
UPDATE products
SET price = CASE category_id
WHEN 1 THEN price * 1.1 -- 电子产品提价10%
WHEN 2 THEN price * 0.9 -- 图书降价10%
ELSE price
END;
搜索 CASE 的适用场景
总结
-
范围判断:根据数值范围返回不同结果。
SELECT score, CASE WHEN score >= 90 THEN '优秀' WHEN score >= 80 THEN '良好' WHEN score >= 60 THEN '及格' ELSE '不及格' END AS grade FROM exam_results;
-
复杂条件组合:结合多个字段或函数进行判断。
SELECT order_id, CASE WHEN status = 'paid' AND DATEDIFF(NOW(), create_time) > 30 THEN '已逾期' WHEN status = 'pending' THEN '待支付' ELSE '已完成' END AS order_status FROM orders;
-
条件聚合:在
SUM
,COUNT
等聚合函数中使用。SELECT COUNT(*) AS total_orders, SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_orders, SUM(CASE WHEN amount > 1000 THEN 1 ELSE 0 END) AS high_value_orders FROM orders;
- 优先使用搜索 CASE:当需要复杂条件或非等值判断时。
- 使用简单 CASE:当只需对单个字段进行等值映射时,可简化代码。