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
都能有效地提高查询的灵活性和可读性。
发表回复