0


SQL中的 CASE WHEN用法详解

SQL中的 CASE WHEN用法详解

目录

在 SQL 中,

CASE WHEN

语句通常用于根据条件执行不同的操作。

1. 基本用法
SELECTCASEWHEN condition1 THEN result1
        WHEN condition2 THEN result2
        ...ELSE default_result
    ENDAS 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
    ,CASEWHEN score >=90THEN'A'WHEN score >=80AND score <90THEN'B'WHEN score >=60AND score <80THEN'C'ELSE'D'ENDAS 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 语句进行数据分组SELECTCASEWHEN age >=60THEN'老年'WHEN age >=40AND age <60THEN'中年'WHEN age >=20AND age <40THEN'青年'ELSE'少年'ENDAS age_group
    ,COUNT(1)AS ct
FROM t_score_info
GROUPBY 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
    ,CASEWHEN score >=90THEN'90+'WHEN score >=80AND score <90THEN'80-90'WHEN score >=60AND score <80THEN'60-80'ELSE'0-60'ENDAS 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 和 聚合函数 一起使用: 计算各个年龄段的总分数SELECTSUM(CASEWHEN age >=60THEN score ELSE0END)AS`老年组总分`,SUM(CASEWHEN age >=40AND age <60THEN score ELSE0END)AS`中年组总分`,SUM(CASEWHEN age >=20AND age <40THEN score ELSE0END)AS`青年组总分`,SUM(CASEWHEN age <20THEN score ELSE0END)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,CASEWHEN age >=60THENCASEWHEN score*1.5>=90THEN'A'WHEN score*1.5>=80AND score*1.5<90THEN'B'WHEN score*1.5>=60AND score*1.5<80THEN'C'ELSE'D'ENDWHEN age >=40AND age <60THENCASEWHEN score*1.2>=90THEN'A'WHEN score*1.2>=80AND score*1.2<90THEN'B'WHEN score*1.2>=60AND score*1.2<80THEN'C'ELSE'D'ENDWHEN age >=20AND age <40THENCASEWHEN score*1.0>=90THEN'A'WHEN score*1.0>=80AND score*1.0<90THEN'B'WHEN score*1.0>=60AND score*1.0<80THEN'C'ELSE'D'ENDELSECASEWHEN score*1.0>=90THEN'A'WHEN score*1.0>=80AND score*1.0<90THEN'B'WHEN score*1.0>=60AND score*1.0<80THEN'C'ELSE'D'ENDENDAS grades
FROM t_score_info
;

user_idnamescoreagegrades1005szy9236A1011teg9818A1001lyf8326B1009spx7246B1008wyb8825B1010yjj8816B1012hxj6148C1004lxm6446C1007ply4267C1002zyb7237C1003whl4525D1006xjp3165D

总结:

CASE WHEN

语句提供了一种在 SQL 查询中根据不同条件执行逻辑的灵活方法。它可用于简单的条件检查,也可用于复杂的逻辑操作。使用

CASE WHEN

可以使查询更具可读性,并且可以减少在应用程序代码中进行逻辑操作的需要。

end
标签: sql 数据库 大数据

本文转载自: https://blog.csdn.net/Taerge0110/article/details/136261423
版权归原作者 Taerge0110 所有, 如有侵权,请联系我们删除。

“SQL中的 CASE WHEN用法详解”的评论:

还没有评论