SQL中的 CASE WHEN用法详解

news/发布时间2024/5/15 15:22:40

SQL中的 CASE WHEN用法详解

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

1. 基本用法
SELECTCASEWHEN condition1 THEN result1WHEN condition2 THEN result2...ELSE default_resultEND AS alias_name
FROMtable_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' ENDWHEN 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' ENDELSE 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' ENDEND 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/ueyF/4149.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

oppo手机如何录屏?解锁录屏新功能!

“最近换了一款oppo手机&#xff0c;感觉它的拍照功能真的很强大。但除此之外&#xff0c;我发现oppo还有许多隐藏功能&#xff0c;比如录屏。但我尝试了很久&#xff0c;都没找到录屏的开关在哪里。有没有哪位oppo用户知道怎么打开这个功能呢&#xff1f;” 随着科技的不断发…

WebStorm 2023:让您更接近理想的开发环境 mac/win版

JetBrains WebStorm 2023激活版下载是一款强大而智能的Web开发工具&#xff0c;专为提高开发人员的生产力而设计。这款编辑器提供了许多先进的代码编辑功能&#xff0c;以及一系列实用的工具和插件&#xff0c;可帮助您更快地编写、调试和测试代码。 WebStorm 2023软件获取 We…

torch.nn.embedding的介绍和用法

nn.Embedding 是 PyTorch 中的一个神经网络层&#xff0c;它主要用于将离散的、高维的数据&#xff08;如词索引&#xff09;转换为连续的、低维的空间中的稠密向量表示。在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;这个层通常用于实现词嵌入&#xff08;Word Em…

高级RAG:揭秘PDF解析

原文地址&#xff1a;https://pub.towardsai.net/advanced-rag-02-unveiling-pdf-parsing-b84ae866344e 2024 年 2 月 3 日 附加内容&#xff1a;揭秘PDF解析&#xff1a;如何从科学pdf论文中提取公式 对于RAG&#xff0c;从文档中提取信息是一个不可避免的场景。确保从源头…

c++的类型转换方法

一、静态类型转换&#xff08;static_cast&#xff09; 静态类型的转换主要用于基本类型之间的转换&#xff0c;比如int类型转换为double类型。但是static_cast也可以支持上下行的转换&#xff08;存在继承关系之间的转换&#xff09; 基本类型之间的转换举例 上下行转换的举…

IDEA 2023.2 配置 JavaWeb 工程

目录 1 不使用 Maven 创建 JavaWeb 工程 1.1 新建一个工程 1.2 配置 Tomcat 1.3 配置模块 Web 2 使用 Maven 配置 JavaWeb 工程 2.1 新建一个 Maven 工程 2.2 配置 Tomcat &#x1f4a5;提示&#xff1a;IDEA 只有专业版才能配置 JavaWeb 工程&#xff0c;若是社区版&am…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的犬种识别系统(附完整代码资源+UI界面+PyTorch代码)

摘要&#xff1a;本文介绍了一种基于深度学习的犬种识别系统系统的代码&#xff0c;采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果&#xff0c;能够准确识别图像、视频、实时视频流以及批量文件中的犬种。文章详细解释了YOLOv8算法的原理&#xff0c;并提供…

【方法】PDF如何与其它格式文件互相转换?

在工作上&#xff0c;有时候我们需要把PDF文件转换成其他格式的文件&#xff0c;比如Word、PPT、jpg等&#xff0c;或者是其他格式文件转换成PDF&#xff0c;那具体要如何操作呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 想把PDF文件转换成其他格式文件&#xff0c…

SQL表(字段)操作

目标&#xff1a;掌握数据库和字段的相关操作指令&#xff0c;熟练运用这些指令完成数据表的增删改查 创建数据表 显示数据库 查看表结构 更改数据表 更改字段 删除数据表 1、创建数据表 目标&#xff1a;了解数据表创建语法&#xff0c;掌握创建规则 概念 创建数据表:根…

智慧城市与数字孪生:共创未来城市新篇章

一、引言 随着科技的飞速发展&#xff0c;智慧城市与数字孪生已成为现代城市建设的核心议题。智慧城市注重利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民生活品质。而数字孪生则通过建立物理城市与数字模型之间的连接&#xff0c;为城市管理、规划…

如何开发自己的npm包并上传到npm官网可以下载

目录 搭建文件结构 开始编写 发布到npm 如何下载我们发布的npm包 搭建文件结构 先创建新文件夹,按照下面的样子布局 .├── README.md //说明文档 ├── index.js //主入口 ├── lib //功能文件 └── tests //测试用例 然后再此根目录下初始化package包 npm init…

【Docker】有用的命令

文章目录 DockerDocker 镜像与容器的差异Docker的好处Hypervisor运维 一、安装docker二、启动docker三、获取docker镜像四、创建镜像使用命令行创建镜像使用dockerfile创建镜像 五、docker报错 Docker docker镜像&#xff08;Image&#xff09; docker镜像类似于虚拟机镜像&…

基于SpringBoot的停车场管理系统

基于SpringBootVue的停车场管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台首页 停车位 个人中心 管理员界面 摘要 摘要&#xff1a;随着城市化进程的…

旧物回收小程序开发,开启绿色生活新篇章

随着科技的发展和人们生活水平的提高&#xff0c;物质生活的丰富带来了大量的废弃物。如何合理处理这些废弃物&#xff0c;实现资源的再利用&#xff0c;已成为社会关注的焦点。旧物回收小程序的开发与应用&#xff0c;为这一问题提供了有效的解决方案。本文将探讨旧物回收小程…

JVM(1)

JVM简介 JVM是Java Virtual Machine的简称,意为Java虚拟机. 在java中,它归属于jre(java运行时环境), 而jre归属于jdk(java开发工具包). 虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统. 常见的虚拟机:JVM, VMwave, VirtualBox. J…

亿道丨三防平板电脑丨安卓加固平板丨加固终端丨如何才叫三防平板

三防平板是指具有防水、防尘和抗震能力的平板电脑。它们通常采用特殊材料和工艺制作&#xff0c;具有更加坚固耐用的外壳和更加严密的密封结构&#xff0c;以适应恶劣的环境条件下的使用。 三防平板的主要优势如下&#xff1a; 防水性能&#xff1a;三防平板具有优异的防水性能…

【Spring MVC篇】简单案例分析

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、加法计算器二…

海外媒体推广通过5个发稿平台开拓国际市场-华媒舍

随着全球化的进程&#xff0c;国际市场对于企业的吸引力日益增加。进入国际市场并获得成功并非易事。海外媒体推广发稿平台成为了一种重要的营销手段&#xff0c;能够帮助企业在国际市场中建立品牌形象、传递信息和吸引目标受众。本文介绍了五个海外媒体推广发稿平台&#xff0…

【Flink集群RPC通讯机制(二)】创建AkkaRpcService、启动RPC服务、实现相互通信

文章目录 零. RpcService服务概述1. AkkaRpcService的创建和初始化2.通过AkkaRpcService初始化RpcServer3. ResourceManager中RPC服务的启动4. 实现相互通讯能力 零. RpcService服务概述 RpcService负责创建和启动Flink集群环境中RpcEndpoint组件的RpcServer&#xff0c;且Rpc…

贪心算法---前端问题

1、贪心算法—只关注于当前阶段的局部最优解,希望通过一系列的局部最优解来推出全局最优----但是有的时候每个阶段的局部最优之和并不是全局最优 例如假设你需要找给客户 n 元钱的零钱&#xff0c;而你手上只有若干种面额的硬币&#xff0c;如 1 元、5 元、10 元、50 元和 100…
推荐文章