CASE 是 SQL 中用于条件判断的语句,类似于编程语言中的 if-else 语句。它允许你在查询中根据不同的条件返回不同的结果,常用于 SELECT 语句中对数据进行动态计算、条件分组和分类。
1. CASE WHEN 语句的基本结构
CASE 有两种常见的语法:简单 CASE 和 搜索 CASE。它们都允许你在 SQL 查询中进行条件判断,并返回不同的值。
(1)简单 CASE 语句
简单的 CASE 语句用于对某个列或表达式的值进行判断,并根据不同的值返回不同的结果。
语法:
SELECT
column1,
column2,
CASE column3
WHEN 'value1' THEN 'result1'
WHEN 'value2' THEN 'result2'
ELSE 'default_result'
END AS new_column
FROM table_name;
解释:
column3是需要判断的列。WHEN后面跟的是你想要匹配的值。THEN后面跟的是匹配该值时返回的结果。ELSE是可选的,如果没有匹配的值,返回默认结果。
例子:
SELECT
product_id,
product_name,
CASE category
WHEN 'A' THEN 'Category A'
WHEN 'B' THEN 'Category B'
ELSE 'Other Category'
END AS category_label
FROM products;
输出结果:
| product_id | product_name | category_label |
|---|---|---|
| 1 | Product 1 | Category A |
| 2 | Product 2 | Category B |
| 3 | Product 3 | Other Category |
(2)搜索 CASE 语句
搜索 CASE 语句允许你对表达式的多个条件进行复杂判断。它不像简单的 CASE 仅仅比较列的值,而是根据任意布尔条件来返回结果。
语法:
SELECT
column1,
column2,
CASE
WHEN condition1 THEN 'result1'
WHEN condition2 THEN 'result2'
ELSE 'default_result'
END AS new_column
FROM table_name;
解释:
condition1和condition2是任意的布尔条件表达式(例如column1 > 10、column2 = 'some_value'等)。THEN后面是当条件成立时返回的结果。ELSE是可选的,表示所有条件都不成立时返回的默认值。
例子:
SELECT
order_id,
order_date,
CASE
WHEN order_amount > 1000 THEN 'High Value'
WHEN order_amount BETWEEN 500 AND 1000 THEN 'Medium Value'
ELSE 'Low Value'
END AS order_value
FROM orders;
输出结果:
| order_id | order_date | order_value |
|---|---|---|
| 101 | 2025-01-01 | High Value |
| 102 | 2025-01-02 | Medium Value |
| 103 | 2025-01-03 | Low Value |
(3)带有 ELSE 和 DEFAULT 的 CASE 语句
CASE 语句中的 ELSE 部分是可选的。如果没有匹配的条件,并且没有 ELSE,则返回 NULL。如果你想要返回特定的默认值,ELSE 就显得非常有用。
例子:
SELECT
employee_id,
department_id,
CASE department_id
WHEN 1 THEN 'HR'
WHEN 2 THEN 'Sales'
WHEN 3 THEN 'IT'
ELSE 'Unknown Department'
END AS department_name
FROM employees;
如果 department_id 不是 1、2 或 3,那么返回 'Unknown Department'。
2. CASE WHEN 用法实例
(1)通过 CASE 进行分类
你可以根据数据的范围或者特定条件,利用 CASE 对数据进行分类。
SELECT
order_id,
order_amount,
CASE
WHEN order_amount >= 1000 THEN 'High'
WHEN order_amount >= 500 THEN 'Medium'
ELSE 'Low'
END AS order_priority
FROM orders;
输出结果:
| order_id | order_amount | order_priority |
|---|---|---|
| 1 | 1500 | High |
| 2 | 750 | Medium |
| 3 | 200 | Low |
(2)在 ORDER BY 子句中使用 CASE
CASE 语句不仅可以在 SELECT 列表中使用,还可以用在 ORDER BY 子句中,进行条件排序。
SELECT product_name, price
FROM products
ORDER BY
CASE
WHEN price > 100 THEN 'High'
WHEN price BETWEEN 50 AND 100 THEN 'Medium'
ELSE 'Low'
END;
这将根据价格范围对产品进行排序。
(3)在 HAVING 子句中使用 CASE
CASE 语句也可以用于 HAVING 子句,以进行更复杂的条件过滤。
SELECT department_id, COUNT(*) AS num_employees
FROM employees
GROUP BY department_id
HAVING COUNT(*) >
CASE
WHEN department_id = 1 THEN 10
WHEN department_id = 2 THEN 5
ELSE 2
END;
此查询会返回员工数量超过指定数目的部门,其中部门 1 的员工数量要求大于 10,部门 2 的员工数量要求大于 5,其他部门要求大于 2。
(4)动态选择字段
在某些情况下,你可能需要根据某个字段的值动态选择要显示的字段。在这种情况下,CASE 语句非常有用。
SELECT
employee_id,
employee_name,
CASE
WHEN job_title = 'Manager' THEN 'Management'
WHEN job_title = 'Developer' THEN 'Technical'
ELSE 'Other'
END AS job_category
FROM employees;
3. 使用 CASE 的常见场景
- 分组和分类: 根据条件将数据分组或分类,例如销售额、年龄段等。
- 数据转换: 将某些特定的值转换为更具意义的标签,如将状态码转为描述文本。
- 动态排序: 在排序时根据条件动态地调整排序规则。
- 条件聚合: 在
HAVING子句中应用条件聚合,如按不同条件过滤分组的结果。
4. 性能注意事项
虽然 CASE 在 SQL 查询中非常强大且灵活,但也要注意以下几点:
- 避免过多嵌套: 在复杂查询中,嵌套多个
CASE语句可能会导致性能问题。尽量避免过度嵌套。 - 检查索引的使用: 在进行条件判断时,确保相关字段有索引支持,这有助于提高查询的性能。
- 使用
ELSE默认值: 在CASE语句中,如果没有ELSE,未匹配的条件将返回NULL。这可能会导致意外的结果,因此建议使用ELSE提供默认值。
总结
CASE WHEN 语句是 SQL 中一种非常强大的条件判断工具,广泛应用于数据分类、排序、聚合和转换等场景。通过使用 CASE 语句,开发者可以在查询中动态地进行条件判断,并根据不同的条件返回不同的结果。无论是在 SELECT、WHERE、HAVING 还是 ORDER BY 中,CASE 都能有效地提高查询的灵活性和可读性。
发表回复