SQL中的 CASE WHEN用法详解

打印 上一主题 下一主题

主题 1879|帖子 1879|积分 5637

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
SQL中的 CASE WHEN用法详解


  
在 SQL 中, CASE WHEN 语句通常用于根据条件实行不同的操作。
1. 根本用法

  1. SELECT
  2.     CASE
  3.         WHEN condition1 THEN result1
  4.         WHEN condition2 THEN result2
  5.         ...
  6.         ELSE default_result
  7.     END AS alias_name
  8. FROM
  9.     table_name;
复制代码


  • CASE 开始一个 CASE WHEN 语句块,END 竣事该块。
  • 按顺序检查每个条件,并在找到第一个为真的条件时返回相应的结果。
  • 假如没有条件为真,则返回 ELSE 部分的默认结果(可选)。
  • 答应在 WHEN 子句中使用表达式作为条件,而不但仅是列或单个值。
2. 举例

  1. 根据学生的成绩, 分为 A B C 和 D 四个等级, A: 大于等于90; B: [80,90); C: [60,80); D:小于60;
复制代码
  1. -- 数据准备
  2. WITH t_score_info AS ( -- 员工信息表
  3. SELECT * FROM (
  4.   VALUES    (1001, 'lyf', 83),
  5.             (1002, 'zyb', 72),
  6.             (1003, 'whl', 45),
  7.             (1004, 'lxm', 64),
  8.             (1005, 'szy', 92),
  9.             (1006, 'xjp', 31),
  10.             (1007, 'ply', 42),
  11.             (1008, 'wyb', 88),
  12.             (1009, 'spx', 72),
  13.             (1010, 'yjj', 88),
  14.             (1011, 'teg', 98),
  15.             (1012, 'hxj', 61)
  16. ) AS table_name(user_id, name, score)
  17. )
  18. -- CASE WHEN 使用
  19. SELECT user_id, name, score
  20.     , CASE
  21.         WHEN score >= 90 THEN 'A'
  22.         WHEN score >= 80 AND score < 90 THEN 'B'
  23.         WHEN score >= 60 AND score < 80 THEN 'C'
  24.         ELSE 'D'
  25.       END AS grades
  26. FROM t_score_info
  27. ;
复制代码
user_idnamescoregrades1011teg98A1005szy92A1008wyb88B1010yjj88B1001lyf83B1002zyb72C1009spx72C1004lxm64C1012hxj61C1003whl45D1007ply42D1006xjp31D 3. 使用 CASE WHEN 语句举行数据分组

  1. -- 数据准备
  2. WITH t_score_info AS ( -- 员工信息表
  3. SELECT * FROM (
  4.   VALUES    (1001, 'lyf', 83, 26),
  5.             (1002, 'zyb', 72, 37),
  6.             (1003, 'whl', 45, 25),
  7.             (1004, 'lxm', 64, 46),
  8.             (1005, 'szy', 92, 36),
  9.             (1006, 'xjp', 31, 65),
  10.             (1007, 'ply', 42, 67),
  11.             (1008, 'wyb', 88, 25),
  12.             (1009, 'spx', 72, 46),
  13.             (1010, 'yjj', 88, 16),
  14.             (1011, 'teg', 98, 18),
  15.             (1012, 'hxj', 61, 48)
  16. ) AS table_name(user_id, name, score, age)
  17. )
  18. -- 使用 CASE WHEN 语句进行数据分组
  19. SELECT  
  20.     CASE
  21.       WHEN age >= 60 THEN '老年'
  22.       WHEN age >= 40 AND age < 60 THEN '中年'
  23.       WHEN age >= 20 AND age < 40 THEN '青年'
  24.       ELSE '少年'
  25.     END AS age_group
  26.     , COUNT(1) AS ct
  27. FROM t_score_info
  28. GROUP BY age_group
  29. ;
复制代码
age_groupct少年2老年2中年3青年5 4. 使用 CASE WHEN 语句修改字段值

  1. -- 数据准备
  2. WITH t_score_info AS ( -- 员工信息表
  3. SELECT * FROM (
  4.   VALUES    (1001, 'lyf', 83, 26, 'C'),
  5.             (1002, 'zyb', 72, 37, 'B'),
  6.             (1003, 'whl', 45, 25, 'C'),
  7.             (1004, 'lxm', 64, 46, 'C'),
  8.             (1005, 'szy', 92, 36, 'B'),
  9.             (1006, 'xjp', 31, 65, 'C'),
  10.             (1007, 'ply', 42, 67, 'B'),
  11.             (1008, 'wyb', 88, 25, 'C'),
  12.             (1009, 'spx', 72, 46, 'B'),
  13.             (1010, 'yjj', 88, 16, 'B'),
  14.             (1011, 'teg', 98, 18, 'A'),
  15.             (1012, 'hxj', 61, 48, 'B')
  16. ) AS table_name(user_id, name, score, age, grades)
  17. )
  18. -- 使用 CASE WHEN 语句修改字段值: 将分数分分数段展示, 不展示具体分数值
  19. SELECT user_id, name
  20.     , CASE
  21.         WHEN score >= 90 THEN '90+'
  22.         WHEN score >= 80 AND score < 90 THEN '80-90'
  23.         WHEN score >= 60 AND score < 80 THEN '60-80'
  24.         ELSE '0-60'
  25.       END AS score
  26. FROM t_score_info
  27. ;
复制代码
user_idnamescore1001lyf80-901002zyb60-801003whl0-601004lxm60-801005szy90+1006xjp0-601007ply0-601008wyb80-901009spx60-801010yjj80-901011teg90+1012hxj60-80 5. CASE WHEN 和 聚合函数 一起使用

  1. -- 数据准备
  2. WITH t_score_info AS ( -- 员工信息表
  3. SELECT * FROM (
  4.   VALUES    (1001, 'lyf', 83, 26, 'C'),
  5.             (1002, 'zyb', 72, 37, 'B'),
  6.             (1003, 'whl', 45, 25, 'C'),
  7.             (1004, 'lxm', 64, 46, 'C'),
  8.             (1005, 'szy', 92, 36, 'B'),
  9.             (1006, 'xjp', 31, 65, 'C'),
  10.             (1007, 'ply', 42, 67, 'B'),
  11.             (1008, 'wyb', 88, 25, 'C'),
  12.             (1009, 'spx', 72, 46, 'B'),
  13.             (1010, 'yjj', 88, 16, 'B'),
  14.             (1011, 'teg', 98, 18, 'A'),
  15.             (1012, 'hxj', 61, 48, 'B')
  16. ) AS table_name(user_id, name, score, age, grades)
  17. )
  18. -- CASE WHEN 和 聚合函数 一起使用: 计算各个年龄段的总分数
  19. SELECT  
  20.       SUM(CASE WHEN age >= 60 THEN score ELSE 0 END) AS `老年组总分`
  21.     , SUM(CASE WHEN age >= 40 AND age < 60 THEN score ELSE 0 END) AS `中年组总分`
  22.     , SUM(CASE WHEN age >= 20 AND age < 40 THEN score ELSE 0 END) AS `青年组总分`
  23.     , SUM(CASE WHEN age < 20 THEN score ELSE 0 END) AS `少年组总分`
  24. FROM t_score_info
  25. ;
复制代码
老年组总分中年组总分青年组总分少年组总分73197380186 6. CASE WHEN 的嵌套使用

  1. -- 数据准备
  2. WITH t_score_info AS ( -- 员工信息表
  3. SELECT * FROM (
  4.   VALUES    (1001, 'lyf', 83, 26, 'C'),
  5.             (1002, 'zyb', 72, 37, 'B'),
  6.             (1003, 'whl', 45, 25, 'C'),
  7.             (1004, 'lxm', 64, 46, 'C'),
  8.             (1005, 'szy', 92, 36, 'B'),
  9.             (1006, 'xjp', 31, 65, 'C'),
  10.             (1007, 'ply', 42, 67, 'B'),
  11.             (1008, 'wyb', 88, 25, 'C'),
  12.             (1009, 'spx', 72, 46, 'B'),
  13.             (1010, 'yjj', 88, 16, 'B'),
  14.             (1011, 'teg', 98, 18, 'A'),
  15.             (1012, 'hxj', 61, 48, 'B')
  16. ) AS table_name(user_id, name, score, age, grades)
  17. )
  18. -- CASE WHEN 的嵌套使用: 不同年龄段,成绩乘上不同系数之后,再判定等级(青年:1.0, 少年:1.0, 中年:1.1, 老年:1.2)
  19. SELECT  user_id, name, score, age,
  20.     CASE
  21.       WHEN age >= 60 THEN
  22.         CASE
  23.         WHEN score*1.5 >= 90 THEN 'A'
  24.         WHEN score*1.5 >= 80 AND score*1.5 < 90 THEN 'B'
  25.         WHEN score*1.5 >= 60 AND score*1.5 < 80 THEN 'C'
  26.         ELSE 'D' END
  27.       WHEN age >= 40 AND age < 60 THEN
  28.         CASE
  29.         WHEN score*1.2 >= 90 THEN 'A'
  30.         WHEN score*1.2 >= 80 AND score*1.2 < 90 THEN 'B'
  31.         WHEN score*1.2 >= 60 AND score*1.2 < 80 THEN 'C'
  32.         ELSE 'D' END
  33.       WHEN age >= 20 AND age < 40 THEN
  34.         CASE
  35.         WHEN score*1.0 >= 90 THEN 'A'
  36.         WHEN score*1.0 >= 80 AND score*1.0 < 90 THEN 'B'
  37.         WHEN score*1.0 >= 60 AND score*1.0 < 80 THEN 'C'
  38.         ELSE 'D' END
  39.       ELSE
  40.         CASE
  41.         WHEN score*1.0 >= 90 THEN 'A'
  42.         WHEN score*1.0 >= 80 AND score*1.0 < 90 THEN 'B'
  43.         WHEN score*1.0 >= 60 AND score*1.0 < 80 THEN 'C'
  44.         ELSE 'D' END
  45.     END AS grades
  46. FROM t_score_info
  47. ;
复制代码
user_idnamescoreagegrades1005szy9236A1011teg9818A1001lyf8326B1009spx7246B1008wyb8825B1010yjj8816B1012hxj6148C1004lxm6446C1007ply4267C1002zyb7237C1003whl4525D1006xjp3165D 总结:

​ CASE WHEN 语句提供了一种在 SQL 查询中根据不同条件实行逻辑的机动方法。它可用于简朴的条件检查,也可用于复杂的逻辑操作。使用 CASE WHEN 可以使查询更具可读性,而且可以减少在应用程序代码中举行逻辑操作的需要。
end


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表