当前位置:  首页>> 技术小册>> SQL基础教程(中)

6-3 CASE表达式

在SQL中,CASE表达式是一种强大的条件逻辑工具,它允许在查询的单个字段内执行复杂的条件判断,并根据这些条件返回不同的结果。这种灵活性使得CASE表达式在数据分析和报表生成中尤为有用,特别是在需要根据特定条件对数据进行分类或转换时。本章节将深入探讨CASE表达式的语法、用法、示例以及其在实践中的应用。

6.3.1 CASE表达式基础

CASE表达式有两种基本形式:简单CASE表达式和搜索CASE表达式。尽管在功能上它们可以相互替代,但在语法和某些使用场景下,选择最适合的一种可以提高代码的可读性和效率。

简单CASE表达式

简单CASE表达式基于单个表达式的值进行比较,并返回与之匹配的结果。其基本语法如下:

  1. CASE expression
  2. WHEN value1 THEN result1
  3. WHEN value2 THEN result2
  4. ...
  5. ELSE default_result
  6. END

这里,expression是要与各个valueN进行比较的表达式,如果expression = valueN为真,则返回resultN。如果没有任何valueN匹配,则返回default_result(如果存在的话)。

搜索CASE表达式

搜索CASE表达式提供了更灵活的条件判断机制,它允许直接使用布尔表达式作为条件。其语法如下:

  1. CASE
  2. WHEN condition1 THEN result1
  3. WHEN condition2 THEN result2
  4. ...
  5. ELSE default_result
  6. END

在这里,conditionN是任何返回布尔值的表达式。如果conditionN为真,则返回resultN。如果所有条件都不满足,则返回default_result(如果存在)。

6.3.2 使用CASE表达式的场景

CASE表达式在SQL查询中的应用非常广泛,包括但不限于以下场景:

  1. 数据分类:根据数据列的值将数据行分类到不同的类别中。
  2. 数据转换:基于某些条件将数据从一个值转换为另一个值。
  3. 条件聚合:在GROUP BY查询中,根据分组内的条件计算不同的聚合值。
  4. 条件排序:在ORDER BY子句中使用CASE表达式实现复杂的排序逻辑。
  5. 计算字段:在查询结果中动态创建新的计算字段。

6.3.3 示例

以下是一些使用CASE表达式的具体示例,以展示其在实际应用中的强大功能。

示例1:数据分类

假设有一个名为employees的表,包含员工的ID、姓名和部门ID。我们要根据部门ID将员工分类为“销售”、“技术”或“其他”。

  1. SELECT
  2. employee_id,
  3. name,
  4. CASE department_id
  5. WHEN 1 THEN '销售'
  6. WHEN 2 THEN '技术'
  7. ELSE '其他'
  8. END AS department_name
  9. FROM employees;
示例2:数据转换

假设我们有一个名为grades的表,记录了学生的成绩(以百分制表示)。我们想要将成绩转换为等级制(A、B、C、D、F)。

  1. SELECT
  2. student_id,
  3. score,
  4. CASE
  5. WHEN score >= 90 THEN 'A'
  6. WHEN score >= 80 THEN 'B'
  7. WHEN score >= 70 THEN 'C'
  8. WHEN score >= 60 THEN 'D'
  9. ELSE 'F'
  10. END AS grade
  11. FROM grades;
示例3:条件聚合

考虑一个销售数据表sales,包含销售日期、产品ID和销售额。我们想要计算每个产品的总销售额,并区分哪些是“高销售额”产品(销售额超过平均值)。

  1. WITH avg_sales AS (
  2. SELECT AVG(sales_amount) AS avg_amount
  3. FROM sales
  4. )
  5. SELECT
  6. product_id,
  7. SUM(sales_amount) AS total_sales,
  8. CASE
  9. WHEN SUM(sales_amount) > (SELECT avg_amount FROM avg_sales) THEN '高销售额'
  10. ELSE '低销售额'
  11. END AS sales_category
  12. FROM sales
  13. GROUP BY product_id;

注意:此示例使用了公用表表达式(CTE)来计算销售额的平均值,以便在CASE表达式中使用。

示例4:条件排序

假设我们想要根据员工的入职年份对员工进行排序,但想要将特定年份(如2020年)入职的员工排在最前面。

  1. SELECT
  2. employee_id,
  3. name,
  4. hire_year,
  5. CASE
  6. WHEN hire_year = 2020 THEN 1
  7. ELSE 2
  8. END AS sort_order
  9. FROM employees
  10. ORDER BY sort_order, hire_year;

这里,我们通过为特定条件(2020年入职)的员工分配较低的排序值(1),实现了将这些员工排在最前面的目的。

6.3.4 总结

CASE表达式是SQL中一个非常强大的工具,它允许在查询中执行复杂的条件逻辑,并根据这些条件返回不同的结果。无论是进行数据分类、转换、条件聚合,还是在排序时使用复杂的逻辑,CASE表达式都能提供灵活且强大的解决方案。通过熟练掌握CASE表达式的使用,你可以编写出更加高效、可读且功能丰富的SQL查询。


该分类下的相关小册推荐: