SQL之CASE WHEN用法详解
关键要点
CASE WHEN
是 SQL 中的条件表达式,用于根据不同条件返回不同值,类似于编程中的if-else
。- 它有两种形式:简单 CASE(比较值)和搜索 CASE(评估条件),都支持可选的 ELSE 子句。
- 研究表明,
CASE WHEN
常用于 SELECT、WHERE 和 GROUP BY 等场景,适合处理复杂条件逻辑。
基本用法
CASE WHEN
允许你在 SQL 查询中根据条件动态返回结果,适合初学者和进阶用户。以下是其核心用法:
语法概述
- 简单 CASE:比较一个表达式与多个值。
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
- 搜索 CASE:根据条件返回结果。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
END
常见应用
- 在 SELECT 中创建新列:如根据分数评定等级。
- 在 WHERE 中动态过滤:如筛选特定条件的数据。
- 在 GROUP BY 中分类统计:如按性别分组计数。
详细报告
引言
SQL 中的 CASE WHEN
语句是一种强大的条件表达式,用于在查询中根据不同的条件返回不同的值。它类似于编程语言中的 if-else
语句,但更适合 SQL 的查询场景。本报告基于 2025 年 7 月 15 日的在线资源,整理了 CASE WHEN
的详细用法,包括语法、不同形式、使用场景和注意事项,旨在为用户提供全面的中文讲解。
背景与概述
CASE WHEN
是 SQL 标准的一部分,支持多种数据库系统(如 MySQL、Oracle、SQL Server 和 Hive)。它允许用户在查询中实现条件逻辑,特别适用于需要动态分类、计算或过滤的数据处理场景。根据研究,CASE WHEN
有两种主要形式:简单 CASE 和搜索 CASE,分别适用于不同的使用场景。
语法结构
CASE WHEN
语句有两种形式,具体如下:
1.1 简单 CASE
简单 CASE 用于比较一个表达式与一系列值,并返回第一个匹配的值。
- 语法:
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
- 参数说明:
expression
:需要比较的表达式。value1, value2, ...
:与表达式比较的值。result1, result2, ...
:当表达式等于相应值时返回的结果。default_result
:如果没有匹配的值,则返回的默认结果(可选,若省略则返回 NULL)。- 示例:将性别代码转换为中文。
SELECT
id,
name,
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'
END AS gender
FROM users;
1.2 搜索 CASE
搜索 CASE 用于根据一系列条件返回不同的值,类似于多条件 if-else
。
- 语法:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
- 参数说明:
condition1, condition2, ...
:需要评估的条件(通常是布尔表达式,如score > 60
)。result1, result2, ...
:当相应条件为真时返回的结果。default_result
:如果所有条件都不为真,则返回的默认结果(可选,若省略则返回 NULL)。- 示例:根据分数评定成绩等级。
SELECT
student_name,
score,
CASE
WHEN score < 60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >= 80 THEN '优秀'
ELSE '异常'
END AS remark
FROM students;
使用场景
CASE WHEN
可以在 SQL 查询的不同部分使用,包括 SELECT
、WHERE
、GROUP BY
等,以下是具体应用。
2.1 在 SELECT 语句中使用
这是最常见的用法,用于创建新的列,根据条件返回不同的值。
- 示例 1:根据销售额计算奖金。
SELECT
salesperson,
amount,
CASE
WHEN amount >= 5000 THEN amount * 0.1
WHEN amount >= 3000 AND amount < 5000 THEN amount * 0.08
WHEN amount >= 1000 AND amount < 3000 THEN amount * 0.05
ELSE 0
END AS bonus
FROM sales;
- 说明:根据销售额的不同区间,计算不同比例的奖金。
- 示例 2:学生成绩评定。
SELECT
student_name,
score,
CASE
WHEN score < 60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >= 80 THEN '优秀'
ELSE '异常'
END AS remark
FROM students;
- 说明:根据分数区间返回不同的评定结果。
2.2 在 WHERE 子句中使用
虽然不常见,但可以将 CASE WHEN
嵌套在 WHERE
子句中,用于动态过滤。
- 示例:筛选出高价高库存的产品。
SELECT *
FROM products
WHERE (CASE
WHEN price > 100 THEN
CASE
WHEN stock > 50 THEN 'High Stock High Price'
ELSE 'Low Stock High Price'
END
ELSE
CASE
WHEN stock > 50 THEN 'High Stock Low Price'
ELSE 'Low Stock Low Price'
END
END) = 'High Stock High Price';
- 说明:先根据价格和库存分类,然后筛选出符合“高价高库存”的产品。
2.3 在 GROUP BY 中使用
可以使用 CASE WHEN
在分组时动态分类。
- 示例:根据性别统计人数。
SELECT
CASE WHEN sex = 1 THEN '男' ELSE '女' END AS gender,
COUNT(*) AS count
FROM students
GROUP BY CASE WHEN sex = 1 THEN '男' ELSE '女' END;
- 说明:将性别字段动态转换为“男”或“女”,并根据此分组统计人数。
2.4 其他高级应用
- 与 SUM 结合使用:统计不同类别的数量。
- 示例:统计男女性别人数。
SELECT SUM(CASE WHEN sex = 0 THEN 1 ELSE 0 END) AS male_count, SUM(CASE WHEN sex = 1 THEN 1 ELSE 0 END) AS female_count FROM students;
- 说明:使用
SUM
和CASE WHEN
实现条件计数。
- 说明:使用
- 行转列:根据条件汇总数据。
- 示例:按城市统计水、电、热能耗。
sql SELECT e_code, SUM(CASE WHEN e_type = 0 THEN e_value ELSE 0 END) AS water_energy, SUM(CASE WHEN e_type = 1 THEN e_value ELSE 0 END) AS ele_energy, SUM(CASE WHEN e_type = 2 THEN e_value ELSE 0 END) AS heat_energy FROM energy_test GROUP BY e_code;
- 说明:根据能源类型分类汇总。
注意事项
以下是使用 CASE WHEN
时需要注意的事项:
- 数据类型一致性:
THEN
和ELSE
后的结果应具有兼容的数据类型,否则可能导致错误(如 Oracle 中的 ORA-00932)。 - NULL 处理:如果没有
ELSE
子句且没有条件满足,CASE WHEN
将返回NULL
。 - 性能考虑:在处理大量数据时,
CASE WHEN
可能影响性能,建议优化查询逻辑。 - NULL 检查:在条件中检查
NULL
时,应使用IS NULL
,而不是= NULL
。
工具对比表
以下是 CASE WHEN
在不同数据库中的支持情况,方便用户参考:
数据库 | 支持形式 | 备注 |
---|---|---|
MySQL | 简单 CASE, 搜索 CASE | 支持标准 SQL 语法,广泛使用 |
Oracle | 简单 CASE, 搜索 CASE | 支持嵌套,注意数据类型一致性 |
SQL Server | 简单 CASE, 搜索 CASE | 可用于 SELECT, WHERE, GROUP BY |
Hive | 简单 CASE, 搜索 CASE | 适合大数据处理,支持嵌套逻辑 |
结论
SQL 中的 CASE WHEN
语句是实现条件逻辑的关键工具,可以在查询中根据不同的条件返回不同的值,适用于各种复杂的查询场景。通过掌握其语法和使用方法,可以大大提升 SQL 查询的灵活性和效率。建议根据具体数据库系统和业务需求选择合适的用法,并注意性能优化。
参考资料: