模块课程(3/4)
条件逻辑:CASE WHEN
到目前为止我们所看到的一切都是按原样提取数据的。但通常情况下,你想要
转变它:将工资分类,将新员工标记为
“junior”,将数字代码翻译成可读标签。 SQL的标准
用于此目的的工具称为 CASE WHEN。
语法:一个迷你 if/else
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。
-- 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)。
哪里使用案例
三个重复出现的地方:
- **在
SELECT**中创建派生列(如上例)。 - 在
ORDER BY中用于“自定义”排序:SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - 内部聚合函数“有条件地计数”:
此模式 —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)— 是最常见的 仪表板中使用的“条件计数”。
“紧凑”形式
当您比较单个表达式时,还有一个更短的变体 针对精确值:
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,只是更紧凑。它仅适用于完全相等:如果
您需要 >= 或其他比较,您必须返回到扩展
形式。
尝试一下
对于每个员工,显示名字 (first_name)、姓氏 (last_name) 和“层级”列,如果工资至少为 50000,则为“Alto”,否则为“Standard”。三列,每个员工一行。
显示提示
条件是工资 >= 50000。记住用 END 关闭 CASE 并使用别名“tier”。
3 次尝试后可用的解决方案
复习练习
对于每个部门(department_id),使用 SUM(CASE...) 统计有多少员工为高薪(>= 50000)和多少为标准员工(< 50000)。三列:department_id、high、standard。按部门 ID 排序(最后为 NULL)。
显示提示
SUM(CASE WHEN ... THEN 1 ELSE 0 END) 模式是条件计数。
3 次尝试后可用的解决方案