🎬 开场白:数据也得贴标签,才好讲人话
日常生活中我们经常会说:
- "这个房租太高了!"
- "这房子属于中等价位。"
- "太便宜了,有猫腻。"
这些评价,其实就是对数据打标签。
在 SQL 里,我们用一个非常强大的工具来实现这种逻辑判断:
CASE WHEN:SQL 里的"如果说......否则......"
1️⃣ 什么是 CASE WHEN?
它是 SQL 里的"判断语句"。
语法结构:
sql
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 默认结果
END
它可以出现在 SELECT 里作为"字段",也能出现在 ORDER BY、WHERE 等位置。
2️⃣ 示例表:houses 房源表
house_id | title | price | district |
---|---|---|---|
1 | 精装一房 | 1800 | 天河 |
2 | 电梯两房 | 2500 | 越秀 |
3 | 合租三房 | 2000 | 天河 |
4 | 豪华复式 | 3600 | 海珠 |
5 | 简装单间 | 1500 | 越秀 |
3️⃣ 用 CASE WHEN 给房子分类
✅ 按价格分档(低/中/高):
sql
SELECT title, price,
CASE
WHEN price < 1800 THEN '便宜'
WHEN price BETWEEN 1800 AND 2500 THEN '中等'
ELSE '昂贵'
END AS 价格档位
FROM houses;
结果:
title | price | 价格档位 |
---|---|---|
精装一房 | 1800 | 中等 |
电梯两房 | 2500 | 中等 |
合租三房 | 2000 | 中等 |
豪华复式 | 3600 | 昂贵 |
简装单间 | 1500 | 便宜 |
4️⃣ 用 CASE WHEN 做复杂字段的展示
✅ 显示"推荐语"字段(根据价格+区域)
sql
SELECT title, price, district,
CASE
WHEN price > 3000 THEN '高端精选'
WHEN district = '天河' THEN '位置优越'
ELSE '性价比之选'
END AS 推荐语
FROM houses;
5️⃣ 和聚合函数搭配使用
✅ 看各区平均租金,是否高于全市平均
sql
SELECT district, AVG(price) AS avg_price,
CASE
WHEN AVG(price) > (
SELECT AVG(price) FROM houses
) THEN '高于平均'
ELSE '低于平均'
END AS 对比情况
FROM houses
GROUP BY district;
📌 注意:在 GROUP BY 语句中使用 CASE 时,要结合聚合函数一起判断。
🧠 CASE WHEN 口诀
sql
CASE WHEN 是判断王,
语法像 if 来帮忙。
一层一层设条件,
分类打标最在行。
组合逻辑搭聚合,
动态字段都能扛。
🛠 小练习题
1. 按价格将房子分为"低、中、高"
sql
SELECT title, price,
CASE
WHEN price < 2000 THEN '低'
WHEN price <= 3000 THEN '中'
ELSE '高'
END AS 价位
FROM houses;
2. 给每套房生成一句"推荐语"
sql
SELECT title, district, price,
CASE
WHEN district = '天河' AND price <= 2000 THEN '通勤之选'
WHEN district = '海珠' THEN '生活便利'
ELSE '适合预算党'
END AS 推荐标签
FROM houses;