马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
SQL中的 CASE WHEN用法详解
在 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_idnamescoregrades1011teg98A1005szy92A1008wyb88B1010yjj88B1001lyf83B1002zyb72C1009spx72C1004lxm64C1012hxj61C1003whl45D1007ply42D1006xjp31D 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_idnamescore1001lyf80-901002zyb60-801003whl0-601004lxm60-801005szy90+1006xjp0-601007ply0-601008wyb80-901009spx60-801010yjj80-901011teg90+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_idnamescoreagegrades1005szy9236A1011teg9818A1001lyf8326B1009spx7246B1008wyb8825B1010yjj8816B1012hxj6148C1004lxm6446C1007ply4267C1002zyb7237C1003whl4525D1006xjp3165D 总结:
CASE WHEN 语句提供了一种在 SQL 查询中根据不同条件实行逻辑的机动方法。它可用于简朴的条件检查,也可用于复杂的逻辑操作。使用 CASE WHEN 可以使查询更具可读性,而且可以减少在应用程序代码中举行逻辑操作的需要。
end
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |