MySQL 条件表达式学习笔记(CASE & IF)
一、CASE 表达式
1. 基础语法
1
2
3
4
5
6
|
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
WHEN 1 THEN '未支付' -- 状态码1对应未支付
WHEN 2 THEN '已支付' -- 状态码2对应已支付
WHEN 3 THEN '已取消' -- 状态码3对应已取消
ELSE '未知状态' -- 兜底处理异常数据
END AS status_text
FROM orders;
|
(2) 数据分组统计(报表分析)
1
2
3
4
5
6
7
8
9
10
11
|
SELECT
-- 按年龄区间分组
CASE
WHEN age < 18 THEN '未成年' -- 18岁以下分组
WHEN age BETWEEN 18 AND 35 THEN '青年' -- 18-35岁分组
WHEN age > 35 THEN '中年及以上' -- 35岁以上分组
ELSE '未填写年龄' -- 处理NULL值
END AS age_group,
COUNT(*) AS user_count -- 统计每组的用户数
FROM users
GROUP BY age_group; -- 按分组字段聚合
|
(3) 多条件商品分类(业务规则实现)
1
2
3
4
5
6
7
8
9
10
11
|
SELECT
product_id,
price,
-- 根据价格、库存等条件动态分类商品
CASE
WHEN price > 1000 THEN '高价商品' -- 单价>1000归为高价
WHEN price > 500 AND stock < 10 THEN '需补货商品' -- 同时满足两个条件
WHEN discount_rate > 0.3 THEN '促销商品' -- 折扣率>30%算促销
ELSE '普通商品' -- 默认分类
END AS product_category
FROM products;
|
二、IF 函数
1. 基础语法
1
2
|
-- 三目运算符形式:condition ? true_value : false_value
IF(condition, true_value, false_value)
|
2. 典型应用场景
(1) 用户类型标记(二元判断)
1
2
3
4
5
|
SELECT
username,
-- 根据is_vip字段返回不同类型文本
IF(is_vip = 1, 'VIP用户', '普通用户') AS user_type
FROM users;
|
(2) 空值处理(数据清洗)
1
2
3
4
5
|
SELECT
order_id,
-- 如果address为NULL则显示默认提示
IF(address IS NULL, '未填写地址', address) AS shipping_address
FROM orders;
|
(3) 库存状态预警(业务监控)
1
2
3
4
5
6
7
8
|
SELECT
product_id,
-- 库存≤5时标记为紧张状态
IF(stock <= 5, '库存紧张', '库存充足') AS stock_status,
-- 嵌套IF示例:多级库存预警
IF(stock = 0, '已售罄',
IF(stock <= 3, '紧急补货', '正常库存')) AS stock_level
FROM products;
|
三、对比总结表
特性 |
CASE |
IF |
条件分支 |
支持多分支(WHEN…THEN) |
仅支持真 / 假两个分支 |
可读性 |
复杂逻辑更清晰 |
简单判断更简洁 |
返回值类型 |
所有分支必须类型一致 |
真假值类型需兼容 |
典型场景 |
多状态映射、复杂业务规则 |
二元判断、NULL 值处理 |
性能 |
多分支时解析稍慢 |
简单判断效率更高 |
四、高级用法示例
1. 动态更新数据(批量业务处理)
1
2
3
4
5
6
7
8
9
10
|
UPDATE products
SET price = CASE
-- 电子产品类打8折
WHEN category_id = 3 THEN price * 0.8
-- 高库存商品打9折
WHEN stock > 100 THEN price * 0.9
-- 其他商品保持原价
ELSE price
END
WHERE is_on_sale = 1; -- 只处理促销商品
|
2. 自定义排序(业务优先级)
1
2
3
4
5
6
7
8
9
|
SELECT * FROM tasks
ORDER BY
-- 按任务优先级自定义排序权重
CASE priority
WHEN 'High' THEN 1 -- 高优先级排最前
WHEN 'Medium' THEN 2 -- 中优先级
WHEN 'Low' THEN 3 -- 低优先级排最后
ELSE 4 -- 无优先级标识的排最后
END ASC;
|
3. 嵌套混合使用(复杂业务逻辑)
1
2
3
4
5
6
7
8
9
10
11
12
|
SELECT
user_id,
-- 先判断是否及格,再细分优良等级
IF(score >= 60,
CASE
WHEN score >= 90 THEN '优秀' -- ≥90为优秀
WHEN score >= 80 THEN '良好' -- 80-89为良好
ELSE '及格' -- 60-79为及格
END,
'不及格' -- <60为不及格
) AS evaluation
FROM exam_results;
|
五、注意事项
类型安全
1
2
3
4
5
|
-- 错误示例:混合返回文本和数字
CASE
WHEN score > 90 THEN '优秀'
WHEN score > 60 THEN 1 -- 会导致类型错误
END
|
NULL 处理
1
2
3
4
5
|
-- 显式处理NULL情况
CASE
WHEN field IS NULL THEN '空值'
WHEN field = 0 THEN '零值'
END
|
性能优化
1
2
3
4
5
|
-- 把高概率条件放在前面
CASE
WHEN status = 'paid' THEN 1 -- 已支付状态最常见
WHEN status = 'unpaid' THEN 2
END
|
索引失效
1
2
3
|
-- 避免在WHERE中对索引字段使用函数
SELECT * FROM users
WHERE IF(age>18,1,0) = 1 -- 导致age索引失效
|
六、实战练习
场景:电商订单分析报表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
SELECT
order_id,
-- 金额分级
CASE
WHEN amount < 50 THEN '小额订单(<50)'
WHEN amount BETWEEN 50 AND 200 THEN '中额订单(50-200)'
ELSE '大额订单(>200)'
END AS order_level,
-- 支付方式处理
IF(payment_method IN (1,2,3),
'在线支付',
'其他支付'
) AS payment_type,
-- 物流状态
CASE
WHEN shipping_status = 0 THEN '待发货'
WHEN shipping_status = 1 AND receive_time IS NULL THEN '运输中'
WHEN receive_time IS NOT NULL THEN '已签收'
ELSE '状态异常'
END AS logistics_status
FROM orders
WHERE create_time > '2023-01-01';
|
通过注释和实际场景示例,可以更清晰地理解 CASE 和 IF 在复杂业务逻辑处理中的应用技巧。建议在数据库管理工具中实际执行这些示例,观察输出结果加深理解。