SQL中的 CASE WHEN用法详解
创始人
2024-11-05 22:07:35

SQL中的 CASE WHEN用法详解

目录

    • SQL中的 CASE WHEN用法详解
        • 1. 基本用法
        • 2. 举例
        • 3. 使用 CASE WHEN 语句进行数据分组
        • 4. 使用 CASE WHEN 语句修改字段值
        • 5. CASE WHEN 和 聚合函数 一起使用
        • 6. CASE WHEN 的嵌套使用
        • 总结:
        • end

在 SQL 中, CASE WHEN 语句通常用于根据条件执行不同的操作。

1. 基本用法
SELECT     CASE         WHEN condition1 THEN result1         WHEN condition2 THEN result2         ...         ELSE default_result     END AS alias_name FROM     table_name; 
  • CASE 开始一个 CASE WHEN 语句块,END 结束该块。
  • 按顺序检查每个条件,并在找到第一个为真的条件时返回相应的结果。
  • 如果没有条件为真,则返回 ELSE 部分的默认结果(可选)。
  • 允许在 WHEN 子句中使用表达式作为条件,而不仅仅是列或单个值。
2. 举例
根据学生的成绩, 分为 A B C 和 D 四个等级, A: 大于等于90; B: [80,90); C: [60,80); D:小于60; 
-- 数据准备 WITH t_score_info AS ( -- 员工信息表 SELECT * FROM (   VALUES    (1001, 'lyf', 83),             (1002, 'zyb', 72),             (1003, 'whl', 45),             (1004, 'lxm', 64),             (1005, 'szy', 92),             (1006, 'xjp', 31),             (1007, 'ply', 42),             (1008, 'wyb', 88),             (1009, 'spx', 72),             (1010, 'yjj', 88),             (1011, 'teg', 98),             (1012, 'hxj', 61) ) AS table_name(user_id, name, score) ) -- CASE WHEN 使用 SELECT user_id, name, score     , CASE          WHEN score >= 90 THEN 'A'         WHEN score >= 80 AND score < 90 THEN 'B'         WHEN score >= 60 AND score < 80 THEN 'C'         ELSE 'D'       END AS grades FROM t_score_info ; 
user_idnamescoregrades
1011teg98A
1005szy92A
1008wyb88B
1010yjj88B
1001lyf83B
1002zyb72C
1009spx72C
1004lxm64C
1012hxj61C
1003whl45D
1007ply42D
1006xjp31D
3. 使用 CASE WHEN 语句进行数据分组
-- 数据准备 WITH t_score_info AS ( -- 员工信息表 SELECT * FROM (   VALUES    (1001, 'lyf', 83, 26),             (1002, 'zyb', 72, 37),             (1003, 'whl', 45, 25),             (1004, 'lxm', 64, 46),             (1005, 'szy', 92, 36),             (1006, 'xjp', 31, 65),             (1007, 'ply', 42, 67),             (1008, 'wyb', 88, 25),             (1009, 'spx', 72, 46),             (1010, 'yjj', 88, 16),             (1011, 'teg', 98, 18),             (1012, 'hxj', 61, 48) ) AS table_name(user_id, name, score, age) )  -- 使用 CASE WHEN 语句进行数据分组 SELECT       CASE        WHEN age >= 60 THEN '老年'       WHEN age >= 40 AND age < 60 THEN '中年'       WHEN age >= 20 AND age < 40 THEN '青年'       ELSE '少年'     END AS age_group     , COUNT(1) AS ct FROM t_score_info GROUP BY age_group ; 
age_groupct
少年2
老年2
中年3
青年5
4. 使用 CASE WHEN 语句修改字段值
-- 数据准备 WITH t_score_info AS ( -- 员工信息表 SELECT * FROM (   VALUES    (1001, 'lyf', 83, 26, 'C'),             (1002, 'zyb', 72, 37, 'B'),             (1003, 'whl', 45, 25, 'C'),             (1004, 'lxm', 64, 46, 'C'),             (1005, 'szy', 92, 36, 'B'),             (1006, 'xjp', 31, 65, 'C'),             (1007, 'ply', 42, 67, 'B'),             (1008, 'wyb', 88, 25, 'C'),             (1009, 'spx', 72, 46, 'B'),             (1010, 'yjj', 88, 16, 'B'),             (1011, 'teg', 98, 18, 'A'),             (1012, 'hxj', 61, 48, 'B') ) AS table_name(user_id, name, score, age, grades) )  -- 使用 CASE WHEN 语句修改字段值: 将分数分分数段展示, 不展示具体分数值 SELECT user_id, name     , CASE          WHEN score >= 90 THEN '90+'         WHEN score >= 80 AND score < 90 THEN '80-90'         WHEN score >= 60 AND score < 80 THEN '60-80'         ELSE '0-60'       END AS score FROM t_score_info ; 
user_idnamescore
1001lyf80-90
1002zyb60-80
1003whl0-60
1004lxm60-80
1005szy90+
1006xjp0-60
1007ply0-60
1008wyb80-90
1009spx60-80
1010yjj80-90
1011teg90+
1012hxj60-80
5. CASE WHEN 和 聚合函数 一起使用
-- 数据准备 WITH t_score_info AS ( -- 员工信息表 SELECT * FROM (   VALUES    (1001, 'lyf', 83, 26, 'C'),             (1002, 'zyb', 72, 37, 'B'),             (1003, 'whl', 45, 25, 'C'),             (1004, 'lxm', 64, 46, 'C'),             (1005, 'szy', 92, 36, 'B'),             (1006, 'xjp', 31, 65, 'C'),             (1007, 'ply', 42, 67, 'B'),             (1008, 'wyb', 88, 25, 'C'),             (1009, 'spx', 72, 46, 'B'),             (1010, 'yjj', 88, 16, 'B'),             (1011, 'teg', 98, 18, 'A'),             (1012, 'hxj', 61, 48, 'B') ) AS table_name(user_id, name, score, age, grades) )  -- CASE WHEN 和 聚合函数 一起使用: 计算各个年龄段的总分数 SELECT         SUM(CASE WHEN age >= 60 THEN score ELSE 0 END) AS `老年组总分`      , SUM(CASE WHEN age >= 40 AND age < 60 THEN score ELSE 0 END) AS `中年组总分`      , SUM(CASE WHEN age >= 20 AND age < 40 THEN score ELSE 0 END) AS `青年组总分`      , SUM(CASE WHEN age < 20 THEN score ELSE 0 END) AS `少年组总分`  FROM t_score_info ; 
老年组总分中年组总分青年组总分少年组总分
73197380186
6. CASE WHEN 的嵌套使用
-- 数据准备 WITH t_score_info AS ( -- 员工信息表 SELECT * FROM (   VALUES    (1001, 'lyf', 83, 26, 'C'),             (1002, 'zyb', 72, 37, 'B'),             (1003, 'whl', 45, 25, 'C'),             (1004, 'lxm', 64, 46, 'C'),             (1005, 'szy', 92, 36, 'B'),             (1006, 'xjp', 31, 65, 'C'),             (1007, 'ply', 42, 67, 'B'),             (1008, 'wyb', 88, 25, 'C'),             (1009, 'spx', 72, 46, 'B'),             (1010, 'yjj', 88, 16, 'B'),             (1011, 'teg', 98, 18, 'A'),             (1012, 'hxj', 61, 48, 'B') ) AS table_name(user_id, name, score, age, grades) )  -- CASE WHEN 的嵌套使用: 不同年龄段,成绩乘上不同系数之后,再判定等级(青年:1.0, 少年:1.0, 中年:1.1, 老年:1.2) SELECT  user_id, name, score, age,     CASE        WHEN age >= 60 THEN          CASE          WHEN score*1.5 >= 90 THEN 'A'         WHEN score*1.5 >= 80 AND score*1.5 < 90 THEN 'B'         WHEN score*1.5 >= 60 AND score*1.5 < 80 THEN 'C'         ELSE 'D' END        WHEN age >= 40 AND age < 60 THEN          CASE          WHEN score*1.2 >= 90 THEN 'A'         WHEN score*1.2 >= 80 AND score*1.2 < 90 THEN 'B'         WHEN score*1.2 >= 60 AND score*1.2 < 80 THEN 'C'         ELSE 'D' END       WHEN age >= 20 AND age < 40 THEN          CASE          WHEN score*1.0 >= 90 THEN 'A'         WHEN score*1.0 >= 80 AND score*1.0 < 90 THEN 'B'         WHEN score*1.0 >= 60 AND score*1.0 < 80 THEN 'C'         ELSE 'D' END       ELSE          CASE          WHEN score*1.0 >= 90 THEN 'A'         WHEN score*1.0 >= 80 AND score*1.0 < 90 THEN 'B'         WHEN score*1.0 >= 60 AND score*1.0 < 80 THEN 'C'         ELSE 'D' END     END AS grades FROM t_score_info ; 
user_idnamescoreagegrades
1005szy9236A
1011teg9818A
1001lyf8326B
1009spx7246B
1008wyb8825B
1010yjj8816B
1012hxj6148C
1004lxm6446C
1007ply4267C
1002zyb7237C
1003whl4525D
1006xjp3165D
总结:

CASE WHEN 语句提供了一种在 SQL 查询中根据不同条件执行逻辑的灵活方法。它可用于简单的条件检查,也可用于复杂的逻辑操作。使用 CASE WHEN 可以使查询更具可读性,并且可以减少在应用程序代码中进行逻辑操作的需要。

end

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...