SQL中的CASE表达式是一个强大的条件逻辑工具,可以用于SELECT、WHERE、ORDER BY、GROUP BY等子句中。以下是详细用法说明:
1. 基本语法结构
简单CASE表达式
CASE 列名或表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
ELSE 默认结果
END
搜索CASE表达式(更常用)
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 默认结果
END
2. 在SELECT中的基本用法
示例1:简单分类
SELECT
employee_name,
salary,
CASE
WHEN salary > 10000 THEN '高薪'
WHEN salary > 5000 THEN '中薪'
ELSE '低薪'
END AS salary_level
FROM employees;
示例2:数值转换
SELECT
product_name,
CASE status
WHEN 'A' THEN '激活'
WHEN 'I' THEN '禁用'
WHEN 'P' THEN '待审核'
ELSE '未知'
END AS status_desc
FROM products;
3. 高级用法
嵌套CASE
SELECT
student_name,
score,
CASE
WHEN score >= 90 THEN
CASE
WHEN score = 100 THEN '完美'
ELSE '优秀'
END
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM students;
在聚合函数中使用
-- 统计不同等级人数
SELECT
COUNT(CASE WHEN score >= 90 THEN 1 END) AS excellent_count,
COUNT(CASE WHEN score >= 60 AND score < 90 THEN 1 END) AS pass_count,
COUNT(CASE WHEN score < 60 THEN 1 END) AS fail_count
FROM students;
4. 在WHERE子句中使用
-- 查找特定条件下的数据
SELECT *
FROM orders
WHERE
CASE
WHEN customer_type = 'VIP' THEN total_amount > 1000
WHEN customer_type = 'NORMAL' THEN total_amount > 5000
ELSE total_amount > 100
END;
5. 在ORDER BY中使用
-- 自定义排序规则
SELECT
product_name,
category,
price
FROM products
ORDER BY
CASE category
WHEN '电子' THEN 1
WHEN '服装' THEN 2
WHEN '食品' THEN 3
ELSE 4
END,
price DESC;
6. 在UPDATE语句中使用
UPDATE employees
SET bonus =
CASE
WHEN performance_rating = 'A' THEN salary * 0.2
WHEN performance_rating = 'B' THEN salary * 0.1
ELSE salary * 0.05
END;
7. 在GROUP BY中使用
-- 按年龄段分组统计
SELECT
CASE
WHEN age < 20 THEN '20岁以下'
WHEN age < 30 THEN '20-29岁'
WHEN age < 40 THEN '30-39岁'
ELSE '40岁以上'
END AS age_group,
COUNT(*) AS user_count,
AVG(income) AS avg_income
FROM users
GROUP BY
CASE
WHEN age < 20 THEN '20岁以下'
WHEN age < 30 THEN '20-29岁'
WHEN age < 40 THEN '30-39岁'
ELSE '40岁以上'
END;
8. 多条件组合示例
-- 综合示例:客户分类
SELECT
customer_id,
customer_name,
total_purchases,
last_purchase_date,
CASE
WHEN total_purchases > 100000 AND DATEDIFF(day, last_purchase_date, GETDATE()) < 30
THEN 'VIP活跃客户'
WHEN total_purchases > 50000 AND DATEDIFF(month, last_purchase_date, GETDATE()) < 3
THEN '重要客户'
WHEN total_purchases > 10000 AND DATEDIFF(month, last_purchase_date, GETDATE()) < 6
THEN '一般客户'
WHEN DATEDIFF(year, last_purchase_date, GETDATE()) > 1
THEN '流失客户'
ELSE '普通客户'
END AS customer_category
FROM customers;
9. 性能优化建议
ELSE子句:总是包含ELSE子句,避免返回NULL
条件顺序:把最可能满足的条件放在前面
避免过度嵌套:嵌套层级不宜超过3层
考虑使用CTE:复杂逻辑可先使用CTE简化
10. 常见注意事项
- END不能省略:每个CASE表达式必须以END结束
- 数据类型一致:所有THEN返回的数据类型应该兼容
- NULL处理:CASE中NULL需要用IS NULL判断
- 性能影响:大量CASE可能影响查询性能
CASE表达式是SQL中非常实用的功能,掌握好它能让你的SQL查询更加灵活和强大。