跳转到主要内容
模块 4 · 第 3 课(共 4)课程中的15/57~10 min
模块课程(3/4)

条件逻辑:CASE WHEN

到目前为止我们所看到的一切都是按原样提取数据的。但通常情况下,你想要 转变它:将工资分类,将新员工标记为 “junior”,将数字代码翻译成可读标签。 SQL的标准 用于此目的的工具称为 CASE WHEN。

语法:一个迷你 if/else

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

它读起来与任何语言中的 if/else if/else 完全相同:SQL 计算 条件按顺序并在第一个为真时停止,返回 对应的value。如果没有一个为 true,则返回 ELSE 值。如果你 省略 ELSE 并且没有分支匹配,它返回 NULL。

SQL
-- Classify employees by salary tier:
SELECT first_name,
       last_name,
       salary,
       CASE
         WHEN salary >= 50000 THEN 'Senior'
         WHEN salary >= 35000 THEN 'Mid'
         ELSE                       'Junior'
       END AS tier
FROM   employees;

CASE 位于 内部 SELECT 中:它会像任何列一样生成一列 函数,给它一个带有 AS 的别名是完全正常的(这里 tier)。

哪里使用案例

三个重复出现的地方:

  1. **在SELECT**中创建派生列(如上例)。
  2. 在 ORDER BY 中用于“自定义”排序:
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. 内部聚合函数“有条件地计数”:
    SQL
    SELECT
      COUNT(*) AS total,
      SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior,
      SUM(CASE WHEN salary <  35000 THEN 1 ELSE 0 END) AS junior
    FROM employees;
    此模式 — SUM(CASE WHEN … THEN 1 ELSE 0 END) — 是最常见的 仪表板中使用的“条件计数”。

“紧凑”形式

当您比较单个表达式时,还有一个更短的变体 针对精确值:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

它相当于 CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END,只是更紧凑。它仅适用于完全相等:如果 您需要 >= 或其他比较,您必须返回到扩展 形式。

尝试一下

锻炼#sql.m4.l3.e1
尝试:0加载中...

对于每个员工,显示名字 (first_name)、姓氏 (last_name) 和“层级”列,如果工资至少为 50000,则为“Alto”​​,否则为“Standard”。三列,每个员工一行。

正在加载编辑器...
显示提示

条件是工资 >= 50000。记住用 END 关闭 CASE 并使用别名“tier”。

3 次尝试后可用的解决方案

复习练习

锻炼#sql.m4.l3.e2
尝试:0加载中...

对于每个部门(department_id),使用 SUM(CASE...) 统计有多少员工为高薪(>= 50000)和多少为标准员工(< 50000)。三列:department_id、high、standard。按部门 ID 排序(最后为 NULL)。

正在加载编辑器...
显示提示

SUM(CASE WHEN ... THEN 1 ELSE 0 END) 模式是条件计数。

3 次尝试后可用的解决方案