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

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

相关内容

热门资讯

安卓系统变身软件有哪些,盘点热... 你有没有发现,你的安卓手机最近是不是有点儿“焕然一新”了呢?是不是觉得它突然变得超级酷炫,仿佛拥有了...
安卓系统在欧珀手机,安卓系统下... 你有没有发现,最近欧珀手机在国内外的市场上可是越来越火了?这不,咱们就来聊聊安卓系统在欧珀手机中的应...
小米2原生安卓7系统,性能与体... 你有没有想过,一部手机,除了拍照、玩游戏,还能给你带来怎样的惊喜?今天,就让我带你走进小米2的世界,...
安卓最简单的手机系统,最简单手... 你有没有想过,拥有一部手机,却不用为复杂的系统烦恼?想象只需轻轻一点,就能完成所有操作,那该多美好!...
ros是安卓系统吗,揭秘安卓系... 哦,亲爱的读者,你是否曾好奇过,ROS(Robot Operating System)是不是安卓系统...
安卓系统装饰房子游戏,打造梦幻... 你知道吗?现在手机游戏可是越来越好玩了,尤其是那些可以在安卓系统上装饰房子的游戏,简直让人爱不释手!...
大厂攻略系统和安卓互通,解锁全... 你有没有想过,那些在大厂工作的朋友们,他们是如何轻松应对各种复杂的工作任务的呢?秘密武器之一,就是那...
amigoos是安卓系统吗,安... 你有没有听说过Amigoos这个软件?最近,它在网上可是引起了不小的讨论呢!很多人都在问,Amigo...
安卓如何弄系统配音,安卓系统配... 你有没有想过,你的安卓手机也能变得像电影里的配音演员一样,声音抑扬顿挫,引人入胜?没错,今天就要来教...
谷歌加大控制安卓系统,新策略解... 你知道吗?最近谷歌可是动作频频,对安卓系统进行了大刀阔斧的改革。这可不是小打小闹,而是要彻底改变安卓...
安卓纯净os系统就是苹果系统吗... 你有没有想过,安卓纯净OS系统是不是就像苹果系统那样呢?是不是一提到纯净,就让人联想到那简洁、优雅的...
win系统和安卓哪个好,谁更胜... 说到电脑操作系统,你是不是也跟很多人一样,在Win系统和安卓之间纠结不已?今天,就让我来给你好好分析...
安卓系统后台走流量,如何有效管... 你有没有发现,手机里的安卓系统有时候就像一个偷跑的小偷,悄无声息地在你不知情的情况下消耗着你的流量呢...
安卓系统upapp怎么更新,从... 亲爱的安卓用户们,你是否也遇到了这样的烦恼:每次打开upapp,总是发现它还停留在那个版本,而新版本...
安卓10系统的华为,创新与性能... 你知道吗?最近手机圈里可是热闹非凡呢!安卓10系统的新风潮已经吹到了华为的身上,让这款国产手机品牌焕...
安卓车机系统推介,安卓车机系统... 你有没有发现,现在开车出门,车机系统的重要性简直堪比手机里的操作系统呢!想象你正驾驶着爱车,突然想听...
安卓5.0系统我的世界,探索安... 亲爱的读者,你是否曾在某个午后,坐在电脑前,被《我的世界》那五彩斑斓的世界深深吸引?今天,就让我带你...
给安卓系统制造故障,揭秘幕后黑... 你知道吗?在科技飞速发展的今天,安卓系统已经成为了全球最受欢迎的手机操作系统之一。但是,你知道吗?有...
安卓系统怎么拍漫画,一键拍出精... 你有没有想过,用安卓手机也能轻松拍出漫画风格的图片呢?没错,就是那种色彩鲜艳、线条流畅,看起来就像是...
安卓系统的心酸史,从心酸起步到... 你有没有想过,我们每天离不开的安卓系统,它也有着一段不为人知的心酸史呢?想象一个从无到有,从默默无闻...