27、CASE 表达式
1、CASE 表达式
是 SQL 标准中用于实现条件逻辑(类似 if-else 或 switch)的功能。
它可以在 SELECT、WHERE、ORDER BY、GROUP BY 甚至 UPDATE/INSERT 中使用,是编写灵活查询的关键工具。
形式1:简单 CASE 表达式
语法:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE default_result END
执行逻辑:逐值比较:将 expression 与每个 WHEN 后面的 value 进行相等比较,
- 如果 expression 与 WHEN 子句中相应的表达式匹配(相等),CASE 语句将返回对应的 result 。
- 如果 expression 与 WHEN 子句中的任何表达式都不匹配,它将返回 ELSE 子句中的 default_result。
- ELSE 子句是可选的。如果您省略 ELSE 子句,并且表达式与 WHEN 子句中的任何表达式都不匹配,则 CASE 表达式将返回 NULL。
形式2:搜索 CASE 表达式
语法:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END
执行逻辑:CASE 表达式从上到下评估每个 WHEN 子句中的布尔表达式。
- 如果表达式为 true,则搜索 CASE 语句返回相应 THEN 子句中的结果。
- 如果表达式的计算结果都为 false,则 CASE 表达式返回 ELSE 子句中的 default_result。
- ELSE 子句是可选的。如果省略它并且没有布尔表达式的计算结果为 true,则 CASE 表达式返回 NULL。
如:表 employees:
| id | name | dept_id | salary | status |
|---|---|---|---|---|
| 1 | Alice | 1 | 95000 | active |
| 2 | Bob | 2 | 45000 | inactive |
| 3 | Carol | 1 | 110000 | active |
| 4 | Dave | 3 | NULL | active |
简单 CASE(Simple CASE),将部门 ID 转为部门名称
SELECT name, dept_id, CASE dept_id WHEN 1 THEN 'Human Resources' WHEN 2 THEN 'Engineering' WHEN 3 THEN 'Sales' ELSE 'Unknown Department' END AS department_name FROM employees;
结果:
| name | dept_id | department_name |
|---|---|---|
| Alice | 1 | Human Resources |
| Bob | 2 | Engineering |
| Carol | 1 | Human Resources |
| Dave | 3 | Sales |
搜索 CASE(Searched CASE),根据薪资划分等级(范围判断)
SELECT name, salary, CASE WHEN salary >= 100000 THEN 'High' WHEN salary >= 50000 THEN 'Medium' WHEN salary IS NULL THEN 'Not Set' ELSE 'Low' END AS salary_level FROM employees;
结果:
| name | salary | salary_level |
|---|---|---|
| Alice | 95000 | Medium |
| Bob | 45000 | Low |
| Carol | 110000 | High |
| Dave | NULL | Not Set |
结合多列条件(复合判断)
SELECT name, status, salary, CASE WHEN status = 'inactive' THEN 'Inactive Employee' WHEN salary > 100000 AND dept_id = 1 THEN 'HR Executive' WHEN salary > 80000 THEN 'Senior Staff' ELSE 'Regular Staff' END AS employee_category FROM employees;
结果:
| name | status | salary | employee_category |
|---|---|---|---|
| Alice | active | 95000 | Senior Staff |
| Bob | inactive | 45000 | Inactive Employee |
| Carol | active | 110000 | HR Executive |
| Dave | active | NULL | Regular Staff |
本文来自博客园,作者:chao_xiong,转载请注明原文链接:https://www.cnblogs.com/chao-xiong/p/19246105

浙公网安备 33010602011771号