CASE WHEN condition1 THEN result1 -- 当满足条件1时返回结果1 WHEN condition2 THEN result2 -- 当满足条件2时返回结果2 ... ELSE default_result -- 默认返回值(可选) END
2. 典型应用场景
(1) 状态码转文字描述(数据可视化)
1 2 3 4 5 6 7 8 9 10
SELECT order_id, -- 将数字状态码转换为可读文本 CASE status WHEN1THEN'未支付'-- 状态码1对应未支付 WHEN2THEN'已支付'-- 状态码2对应已支付 WHEN3THEN'已取消'-- 状态码3对应已取消 ELSE'未知状态'-- 兜底处理异常数据 ENDAS status_text FROM orders;
(2) 数据分组统计(报表分析)
1 2 3 4 5 6 7 8 9 10 11
SELECT -- 按年龄区间分组 CASE WHEN age <18THEN'未成年'-- 18岁以下分组 WHEN age BETWEEN18AND35THEN'青年'-- 18-35岁分组 WHEN age >35THEN'中年及以上'-- 35岁以上分组 ELSE'未填写年龄'-- 处理NULL值 ENDAS age_group, COUNT(*) AS user_count -- 统计每组的用户数 FROM users GROUPBY age_group; -- 按分组字段聚合
(3) 多条件商品分类(业务规则实现)
1 2 3 4 5 6 7 8 9 10 11
SELECT product_id, price, -- 根据价格、库存等条件动态分类商品 CASE WHEN price >1000THEN'高价商品'-- 单价>1000归为高价 WHEN price >500AND stock <10THEN'需补货商品'-- 同时满足两个条件 WHEN discount_rate >0.3THEN'促销商品'-- 折扣率>30%算促销 ELSE'普通商品'-- 默认分类 ENDAS product_category FROM products;
SELECT user_id, -- 先判断是否及格,再细分优良等级 IF(score >=60, CASE WHEN score >=90THEN'优秀'-- ≥90为优秀 WHEN score >=80THEN'良好'-- 80-89为良好 ELSE'及格'-- 60-79为及格 END, '不及格'-- <60为不及格 ) AS evaluation FROM exam_results;
五、注意事项
类型安全
1 2 3 4 5
-- 错误示例:混合返回文本和数字 CASE WHEN score >90THEN'优秀' WHEN score >60THEN1-- 会导致类型错误 END
NULL 处理
1 2 3 4 5
-- 显式处理NULL情况 CASE WHEN field ISNULLTHEN'空值' WHEN field =0THEN'零值' END
性能优化
1 2 3 4 5
-- 把高概率条件放在前面 CASE WHEN status ='paid'THEN1-- 已支付状态最常见 WHEN status ='unpaid'THEN2 END
索引失效
1 2 3
-- 避免在WHERE中对索引字段使用函数 SELECT*FROM users WHERE IF(age>18,1,0) =1-- 导致age索引失效
SELECT order_id, -- 金额分级 CASE WHEN amount <50THEN'小额订单(<50)' WHEN amount BETWEEN50AND200THEN'中额订单(50-200)' ELSE'大额订单(>200)' ENDAS order_level, -- 支付方式处理 IF(payment_method IN (1,2,3), '在线支付', '其他支付' ) AS payment_type, -- 物流状态 CASE WHEN shipping_status =0THEN'待发货' WHEN shipping_status =1AND receive_time ISNULLTHEN'运输中' WHEN receive_time ISNOT NULLTHEN'已签收' ELSE'状态异常' ENDAS logistics_status FROM orders WHERE create_time >'2023-01-01';
通过注释和实际场景示例,可以更清晰地理解 CASE 和 IF 在复杂业务逻辑处理中的应用技巧。建议在数据库管理工具中实际执行这些示例,观察输出结果加深理解。