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_idproduct_namecategory_label
1Product 1Category A
2Product 2Category B
3Product 3Other 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;

解释:

  • condition1condition2 是任意的布尔条件表达式(例如 column1 > 10column2 = '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_idorder_dateorder_value
1012025-01-01High Value
1022025-01-02Medium Value
1032025-01-03Low Value

(3)带有 ELSEDEFAULTCASE 语句

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_idorder_amountorder_priority
11500High
2750Medium
3200Low

(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 的常见场景

  1. 分组和分类: 根据条件将数据分组或分类,例如销售额、年龄段等。
  2. 数据转换: 将某些特定的值转换为更具意义的标签,如将状态码转为描述文本。
  3. 动态排序: 在排序时根据条件动态地调整排序规则。
  4. 条件聚合:HAVING 子句中应用条件聚合,如按不同条件过滤分组的结果。

4. 性能注意事项

虽然 CASE 在 SQL 查询中非常强大且灵活,但也要注意以下几点:

  1. 避免过多嵌套: 在复杂查询中,嵌套多个 CASE 语句可能会导致性能问题。尽量避免过度嵌套。
  2. 检查索引的使用: 在进行条件判断时,确保相关字段有索引支持,这有助于提高查询的性能。
  3. 使用 ELSE 默认值:CASE 语句中,如果没有 ELSE,未匹配的条件将返回 NULL。这可能会导致意外的结果,因此建议使用 ELSE 提供默认值。

总结

CASE WHEN 语句是 SQL 中一种非常强大的条件判断工具,广泛应用于数据分类、排序、聚合和转换等场景。通过使用 CASE 语句,开发者可以在查询中动态地进行条件判断,并根据不同的条件返回不同的结果。无论是在 SELECTWHEREHAVING 还是 ORDER BY 中,CASE 都能有效地提高查询的灵活性和可读性。