SQL利用Case When Then多条件判断

news2024/9/22 0:57:35

CASE
    WHEN 条件1 THEN 结果1
    WHEN 条件2 THEN 结果2
    WHEN 条件3 THEN 结果3
    WHEN 条件4 THEN 结果4
.........
    WHEN 条件N THEN 结果N
    ELSE 结果X
END

Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
         WHEN '1' THEN '男'
         WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
         WHEN sex = '2' THEN '女'
ELSE '其他' END

例如:

SELECT     id, name, cj, (CASE WHEN cj < 60 THEN '不及格' WHEN cj BETWEEN 60 AND 90 THEN '良好' WHEN cj > 90 THEN '优秀' END) AS 状态
FROM   stud


这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
         WHEN col_1 IN ('a')       THEN '第二类'
ELSE'其他' END

下面我们来看一下,使用Case函数都能做些什么事情。

一,已知数据按照另外一种方式进行分组,分析。

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)
国家(country) 人口(population)
中国 600
美国 100
加拿大 100
英国 200
法国 300
日本 250
德国 200
墨西哥 50
印度 250

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 人口
亚洲 1100
北美洲 250
其他 700

想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case函数,SQL代码如下:
SELECT  SUM(population),
        CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END
FROM    Table_A
GROUP BY CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END;

同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SELECT
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END salary_class,
        COUNT(*)
FROM    Table_A
GROUP BY
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END;

二,用一个SQL语句完成不同条件的分组。

有如下数据
国家(country) 性别(sex) 人口(population)
中国 1 340
中国 2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40
英国 2 60

按照国家和性别进行分组,得出结果如下
国家 男 女
中国 340 260
美国 45 55
加拿大 51 49
英国 40 60

普通情况下,用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。
下面是一个是用Case函数来完成这个功能的例子
SELECT country,
       SUM( CASE WHEN sex = '1' THEN
                      population ELSE 0 END),  --男性人口
       SUM( CASE WHEN sex = '2' THEN
                      population ELSE 0 END)   --女性人口
FROM  Table_A
GROUP BY country;

这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。

三,在Check中使用Case函数。

在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。
下面我们来举个例子
公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示
CONSTRAINT check_salary CHECK
           ( CASE WHEN sex = '2'
                  THEN CASE WHEN salary > 1000
                        THEN 1 ELSE 0 END
                  ELSE 1 END = 1 )

如果单纯使用Check,如下所示
CONSTRAINT check_salary CHECK
           ( sex = '2' AND salary > 1000 )

女职员的条件倒是符合了,男职员就无法输入了。

Select top 100 State,JoinState, 

SQL利用Case <wbr>When <wbr>Then多条件判断

(case when State=1 and Joinstate=0 then 2 when State=1 and JoinState=1 then 1 else 0 end) as usestate from UserInfo

(2)

select      ID,Username,namer=(case when(score<='50')    then '实习'

                                    when(score>'50'  and  score<='500' )   then '赤脚医生'    

                                    when(score>'500'  and score<='1000' )   then '村卫生员' 

                                    when(score>'1000'  and score<='1500' )   then '乡卫生员' 

                                    when(score>'1500'  and score<='2000' )   then '镇卫生员'

                                    when(score>'2000'  and score<='3000' )   then '医师'

                                    when(score>'3000'  and score<='5000' )   then '主治医师'

                                    when(score>'5000'  and score<='10000' )   then '副主任医师'

                                    when(score>'10000'  and score<='20000' )   then '主任医师'

                                    when(score>'20000'  and score<='50000' )   then '健康大使'

                                    else   '健康大使'  end ), (SELECT count(id)

         FROM  jk01_YiWen_Question 

         WHERE  UserID =  dbo.jk01_Member.ID)  as  questionnum 

   from  jk01_Member

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-Plus为简化开发而生

简介 MyBatis-Plus 简称 MP是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 他们的愿景是成为 MyBatis 最好的搭档&#xff0c;就像魂斗罗中的 1P、2P&#xff0c;基友搭配&#xff0c;效率翻倍。 特性 无…

JWT 使用入门(一)配置与示例

文章目录 1、用途✨2、实现流程&#x1f440;3、JWT介绍3.1、构成3.1.1、header3.1.2、载荷3.1.3、签证 4、java实现4.1、引入依赖4.2、测试案例 官网链接&#xff1a;https://github.com/jwtk/jjwt 1、用途✨ JWT主要作用分为以下两种&#xff1a; 1&#xff1a;作为在前后端…

css修改滚动条

系统默认的滚动条可能不是很美观&#xff0c;有时候我们想要自己进行样式的修改&#xff0c;就可以用到下面的方法 设置滚动条的属性为overflow&#xff0c;取值是x轴和y轴 如果想单独设置某个轴&#xff0c;可以使用overflow-x,overflow-y <!DOCTYPE html> <html …

测试老鸟整理,Pytest自动化测试框架的一些关键点,一文贯通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Pytest自动化框架&…

Python自动查重之原理、方法与实践详解

什么是自动查重&#xff1f; 自动查重是指使用计算机程序来比较两个或多个文件的内容&#xff0c;判断它们之间是否存在相似或相同的部分&#xff0c;从而检测出抄袭或重复的情况。自动查重可以用于学术论文、代码、文本等各种类型的文件&#xff0c;帮助提高原创性和质量。 为…

kepler.gl 笔记:Layer

Point S2Layer Icon Line Cluster Polygon 一个路径型的GeoJSON图层可以显示诸如行程路线或等值线的数据。轮廓的颜色可以使用数值字段进行设置。 一个多边形型的GeoJSON图层本质上是一种区域填充图层&#xff0c;最适合用于呈现地理围栏。填充颜色或高度可以使用数值字…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Toggle

组件提供勾选框样式、状态按钮样式及开关样式。该组件从API Version 8开始支持。 仅当ToggleType为Button时可包含子组件。 一、接口 Toggle(options: { type: ToggleType, isOn?: boolean }) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 参数: Toggle…

Mac M1安装MongoDB6、后台运行

MongoDB&#xff0c;版本6.02 记录两种使用MongoDB的方法&#xff0c;安装包和docker docker mongo&#xff1a;Mac M1运行、连接 Docker MongoDB7。导出、恢复数据库 一、安装包&#xff0c;以mac M1为例 1、下载对应平台的安装包 M1选择ARM版本 https://www.mongodb.com/t…

SecureCRT 特点介绍 SecureCRT的安装和使用

SecureCRT 是一款支持SSH&#xff08;SSH1和SSH2&#xff09;的终端仿真程序&#xff0c;简单地说是Windows下登录UNIX或Linux服务器主机的软件&#xff0c;优点是可以一次创建多个 Tab Page&#xff0c;连接多台远程主机。 这里使用的是Mac版本的不过不影响&#xff0c;在Win…

RK3568平台开发系列讲解(驱动篇)RK3568 PWM详解

🚀返回专栏总目录 文章目录 一、什么是PWM二、RK3568 PWM2.1、PWM 通道与引脚2.2、PWM 简介2.3、PWM 设备节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 PWM 是很常用到功能,我们可以通过 PWM 来控制电机速度,也可以使用 PWM 来控制 LCD 的背光亮度。 一、什…

每日一题 2512. 奖励最顶尖的 K 名学生(中等,模拟,排序)

思路&#xff1a; 对于每一个学生的评价&#xff0c;使用 split 方法提取评价中的每一个字符&#xff0c;然后逐个判断是否是正面或者负面词汇来计算分数对id按照要求进行排序。为了加快字符的正负判断速度&#xff0c;先将 positive 和 negative 两个列表转化为 set 这样就可…

智能文件管理助手,轻松实现按数量平均分类文件,高效整理新文件夹!

在我们的电脑或移动设备中&#xff0c;文件管理是我们日常工作和生活中不可或缺的一部分。有时候&#xff0c;我们可能需要将一个文件夹中的大量文件按照数量平均分配到多个新的文件夹中&#xff0c;以便更好地进行整理和管理。现在&#xff0c;我们为您提供了一款智能文件管理…

JSAPI实现H5页面微信支付

进入官网文档&#xff1a;> 微信支付官网文档 根据官网文档能够很详细的需要做的事 接下来&#xff0c;采用的是JSAPI的方式在小程序嵌入H5页面中实现微信支付&#xff0c;直接拉起支付页面 一&#xff1a;需要在微信公众号平台和微信支付商家平台获取的配置的关键参数如下…

MidJourney | AI绘画也有艺术

免费绘画&#xff0c;体验更多AI可关&注公&众&号&#xff1a;AI研究工厂

ICPC 2019-2020 North-Western Russia Regional Contest

A (codeforces.com) 这题在移动不被挡板挡住以及不超过边界的情况下&#xff0c;每次走的越多那么次数就越少 只要两个每次都走b-a步&#xff08;已经是不被挡板挡住走的最多了&#xff09;&#xff0c;就不用考虑被挡板挡住的情况&#xff0c;只用单独考虑了&#xff0c;如果…

算法通过村第十三关-术数|黄金笔记|数论问题

文章目录 前言辗转相除法素数和合数埃氏筛选法丑数问题总结 前言 提示&#xff1a;难过的人伤心的人、在生活里面对困境的人、即将抑郁的人、从外面很难看出异样&#xff0c;人的心里却可能有一些裂痕。只是人不会再表面裂开。 --栾颖新《那个苹果也很好》 数论是一个很重要的学…

Stable diffusion 用DeOldify给黑白照片、视频上色

老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术,如 DeOldify,可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。. 之前介绍过基于虚拟环境的 基于DeOldify的给黑白照片、视频上色,本次介绍对于新手比较友好的在Stable diff…

2023年中国非血管介入手术无源耗材发展现状、竞争格局及行业市场规模[图]

非血管介入手术是指通过人体自然腔道或通过人体的小切口接近病灶而无需进入血管系统的微创手术&#xff0c;内窥镜、有源医疗器械及无源耗材则是该手术中最常用的医疗器械。非血管介入手术无源耗材主要包括导丝、球囊导管、取石网篮、封堵导管及鞘管。 非血管介入手术无源耗材…

LeetCode【739】每日温度

题目&#xff1a; 思路&#xff1a; https://www.bilibili.com/video/BV1PJ411H7P7/?spm_id_from333.337.search-card.all.click&vd_source2f682a60feabf0f730ad09e0f980ce83 单调栈 思考&#xff1a; 解决栈类问题&#xff0c;思考入栈&#xff0c;出栈条件&#xff1b;…

vue设置页面超时15分钟自动退出登录

需求&#xff1a;用户登录后&#xff0c;如果长时间未操作页面这个时候需要自动退出登录回到登录页面。 注意点&#xff1a;这里我们如果把超时的时间放到浏览器里面存储&#xff0c;我们要放到本地存储里面localStorage里面 Vue设置长时间未操作登录以后自动到期返回登录页 …