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 查询的不同部分使用,包括 SELECTWHEREGROUP 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;
    • 说明:使用 SUMCASE 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 时需要注意的事项:

  • 数据类型一致性THENELSE 后的结果应具有兼容的数据类型,否则可能导致错误(如 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 查询的灵活性和效率。建议根据具体数据库系统和业务需求选择合适的用法,并注意性能优化。

参考资料

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注