SQL:CASE WHEN使用详解
文章目录
- 1. 数据转换与映射
- 2. 动态条件筛选
- 3. 多条件分组统计
- 4. 数据排名与分级
- 5. 处理空值与默认值
- 6. 动态排序
CASE WHEN
语句在 SQL 中是一个非常强大且灵活的工具,除了常规的条件判断外,还有很多巧妙的用法,以下为你详细总结:
1. 数据转换与映射
- 用途:将一列中的值根据特定规则映射为其他值,常用于数据清洗和标准化。
- 示例:假设有一个
products
表,其中category
列包含值'electronics'
、'clothing'
等,要将这些英文类别转换为中文。
SELECT
product_id,
category,
CASE category
WHEN 'electronics' THEN '电子产品'
WHEN 'clothing' THEN '服装'
ELSE '其他'
END AS chinese_category
FROM
products;
2. 动态条件筛选
- 用途:根据不同的条件动态筛选数据,实现类似参数化查询的功能。
- 示例:假设有一个
orders
表,包含order_date
和amount
列,要根据不同的时间范围筛选出不同金额的订单。
SELECT
order_id,
order_date,
amount
FROM
orders
WHERE
CASE
WHEN MONTH(order_date) BETWEEN 1 AND 6 THEN amount > 100
WHEN MONTH(order_date) BETWEEN 7 AND 12 THEN amount > 200
ELSE 1 = 1 -- 不筛选
END;
3. 多条件分组统计
- 用途:结合聚合函数,根据多个条件对数据进行分组统计。
- 示例:假设有一个
employees
表,包含department
和salary
列,要统计不同部门不同薪水范围的员工数量。
SELECT
department,
SUM(CASE WHEN salary < 3000 THEN 1 ELSE 0 END) AS low_salary_count,
SUM(CASE WHEN salary >= 3000 AND salary < 6000 THEN 1 ELSE 0 END) AS medium_salary_count,
SUM(CASE WHEN salary >= 6000 THEN 1 ELSE 0 END) AS high_salary_count
FROM
employees
GROUP BY
department;
4. 数据排名与分级
- 用途:根据某列的值对数据进行排名或分级。
- 示例:假设有一个
students
表,包含student_id
和score
列,要根据成绩对学生进行分级。
SELECT
student_id,
score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
WHEN score >= 60 THEN 'D'
ELSE 'F'
END AS grade
FROM
students;
5. 处理空值与默认值
- 用途:在查询结果中对空值进行处理,为其设置默认值。
- 示例:假设有一个
customers
表,包含customer_name
和email
列,若email
为空,则显示默认值'未提供邮箱'
。
SELECT
customer_name,
CASE
WHEN email IS NULL THEN '未提供邮箱'
ELSE email
END AS email_info
FROM
customers;
6. 动态排序
- 用途:根据不同的条件对查询结果进行动态排序。
- 示例:假设有一个
products
表,包含product_name
、price
和sales_volume
列,要根据不同的条件对产品进行排序。
SELECT
product_name,
price,
sales_volume
FROM
products
ORDER BY
CASE
WHEN 'price' = 'price' THEN price
WHEN 'sales_volume' = 'sales_volume' THEN sales_volume
ELSE product_name
END;
这些巧妙用法可以让你在处理复杂的 SQL 查询时更加灵活和高效,根据具体的业务需求选择合适的用法来实现所需的功能。