SQL CASE WHEN的用法 sql里面的case when用法
yuyutoo 2024-10-12 01:43 12 浏览 0 评论
Case具有两种格式。简单Case函数和Case搜索函数。
简单Case函数
1 CASE sex
2 WHEN '1' THEN '男'
3 WHEN '2' THEN '女'
4 ELSE '其他' END
Case搜索函数
1 CASE WHEN sex = '1' THEN '男'
2 WHEN sex = '2' THEN '女'
3 ELSE '其他' END
两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
------案例:查询核价单中品号、品号与工艺是否出现在工单工艺的品号与工艺中
SELECT DISTINCT MOCTA.TA006 as 产品品号,SFCTA.TA004 as 工艺,CMSMW.MW002 as 工艺名称 ,
(CASE WHEN (MOCTA.TA006 NOT IN (SELECT MOCTN.TN004 FROM MOCTN )) THEN '新'
WHEN ((MOCTA.TA006 IN (SELECT MOCTN.TN004 FROM MOCTN))
AND (SFCTA.TA004 NOT IN (SELECT MOCTN.TN007 FROM MOCTN WHERE MOCTA.TA006= MOCTN.TN004 ))) THEN '新'
ELSE '历史' END )产品属性
FROM MOCTA as MOCTA
Left JOIN SFCTA as SFCTA On MOCTA.TA001=SFCTA.TA001 and MOCTA.TA002=SFCTA.TA002
Left JOIN CMSMW as CMSMW On SFCTA.TA004=CMSMW.MW001
WHERE ((MOCTA.TA013 = 'Y')AND (SFCTA.TA005 = '2'))
and ((MOCTA.TA006 NOT IN (SELECT MOCTN.TN004 FROM MOCTN ))
or((MOCTA.TA006 IN (SELECT MOCTN.TN004 FROM MOCTN)
AND (SFCTA.TA004 NOT IN (SELECT MOCTN.TN007 FROM MOCTN WHERE MOCTA.TA006= MOCTN.TN004 and MOCTN.TN013 not like '%一次%'))))---品号不在核价单中,或品号在核价单中但加工工艺不在核价单中,核价单备注中不包括一次性价格
order by MOCTA.TA006, SFCTA.TA004
---------------------------CASE WHEN 的更多应用(转载)
一、已知数据按照另外一种方式进行分组,分析
判断是不是在一个类中,然后聚合求出总数
1.求出每个省学生的个数
1 SELECT
2 CASE c.city
3 WHEN '哈尔滨' THEN
4 '黑龙江'
5 WHEN '沈阳' THEN
6 '辽宁'
7 WHEN '长春' THEN
8 '吉林'
9 WHEN '齐齐哈尔' THEN
10 '黑龙江'
11 ELSE
12 '其他地区'
13 END AS province,
14 sum(c.city_count) as stu_nums
15 FROM
16 (
17 SELECT
18 city,
19 count(city) city_count
20 FROM
21 stu_info
22 GROUP BY
23 city
24 ) c
25 GROUP BY
26 CASE c.city
27 WHEN '哈尔滨' THEN
28 '黑龙江'
29 WHEN '沈阳' THEN
30 '辽宁'
31 WHEN '长春' THEN
32 '吉林'
33 WHEN '齐齐哈尔' THEN
34 '黑龙江'
35 ELSE
36 '其他地区'
37 END ORDER BY stu_nums desc;
2.判断学生成绩等级
1 select case
2 when grade >=60 and grade < 70 then 'D'
3 when grade >=70 and grade <80 then 'C'
4 when grade >=80 and grade <90 then 'B'
5 when grade >=90 and grade <=100 then 'A'
6 else 'E' end as level ,count(*) as stu_nums
7 from stu_grade
8 GROUP BY
9 case
10 when grade >=60 and grade < 70 then 'D'
11 when grade >=70 and grade <80 then 'C'
12 when grade >=80 and grade <90 then 'B'
13 when grade >=90 and grade <=100 then 'A'
14 else 'E' end ;
二、用一个SQL语句完成不同条件的分组
一行显示出每个省份的男女人数
普通情况下,用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。下面是一个是用Case函数来完成这个功能的例子
1 select
2 province,
3 sum(case when sex= 'F' then nums else 0 end ) AS F,
4 sum(case when sex = 'M' then nums else 0 end ) AS M
5 from
6 stu_province
7 GROUP BY province
8 ORDER BY F desc;
三、根据条件有选择的UPDATE
3.1例,有如下更新条件
1.工资5000以上的职员,工资减少10%
很容易考虑的是选择执行两次UPDATE语句,如下所示
--条件1(工资5000以上的职员,工资减少10%)
1 UPDATE emp
2 SET salary = salary * 0.9
3 WHERE
4 salary >= 5000;
2.工资在2000到4600之间的职员,工资增加15%
--条件2(工资在2000到4600之间的职员,工资增加15%)
1 UPDATE Personnel SET salary = salary * 1.15
2 WHERE salary >= 2000 AND salary < 4600;
3.发现之前5000的员工编程5175,反而涨薪了,反之如果先执行涨薪在降薪,4600的会比之前少,如果想一个sql执行
UPDATE emp
2 SET salary = CASE
3 WHEN salary >= 2000
4 AND salary <= 4600 THEN
5 salary * 1.15
6 WHEN salary >= 5000 THEN
7 salary * 0.9
8 ELSE
9 salary
10 END;
这里要注意一点,最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。
3.2.互换信息
需求,将Tom和Lily互换部门
1 UPDATE emp
2 SET dept_id = CASE
3 WHEN dept_id = 1 THEN
4 2
5 WHEN dept_id = 2 THEN
6 1
7 ELSE
8 dept_id
9 END;
结果显示
四、两个表数据是否一致的检查
Case函数不同于DECODE函数。在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS,可以进行子查询,从而 实现更多的功能。 下面具个例子来说明,检测员工是否在部门中,返回结果'Matched',如果没有找到,返回结果'Unmatched'。 要实现下面这个功能,可以使用下面两条语句
原始表还是之前的emp,新增dept表
1 SELECT
2 ename,
3 dept_id,
4 CASE
5 WHEN dept_id IN (SELECT id FROM dept) THEN
6 'Matched'
7 ELSE
8 'UnMatched'
9 END as isMatch
10 FROM
11 emp
相关推荐
- Java的经典垃圾收集器G1,如何设置参数,什么场景下适用?
-
G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器.以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。G1将Java堆划分为多个大...
- 这份Java面试八股文让329人成功进入大厂,堪称2021最强
-
前言2021秋招即将来临,很多同学会问Java面试八股文有必要背吗?我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。国内的互联网面试,恐怕是现存的、最接近科举考试的制...
- 网络安全之对文件上传的思考(文件上传功能中出现安全问题)
-
在web渗透中,最简单直接的方式就是文件上传。但是不做任何检测,直接getshell的现在已经很少了.我在平时的授权测试中,遇到的大多数都是对上传的文件内容,格式等检测的比较多的按前端到后端绕过顺序分...
- JVM常用参数自查笔记(jvm参数怎么看)
-
配置堆区:-Xms、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn;-Xms:表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍...
- JAVA集合(java集合类有哪些分别有什么特点)
-
JAVA集合1.接口集成关系和实现集合类存放于Java.util包中,主要有3种:set(集)、list(列表包含Queue)和map(映射)。1.Collection:Collection...
- 体育老师教你学Java语言(中篇)(教java的老师)
-
一、控制结构训练营1.条件语句if-else→赛前资格审查...
- 十年之重修ConcurrentHashMap原理
-
弱小和无知并不是生存的障碍,傲慢才是。...
- 安装JDK(安装jdk的详细步骤)
-
JDK下载地址:JDK组成:javac:编译器,将源程序转成字节码。jar:打包工具,将相关的类文件打包成一个文件。javadoc:文档生成器,从源码注释中提取文档。jdb:debugger,查错...
- CentOS 7 上安装 JDK 8 的步骤:(centos7下载jdk)
-
CentOS7上安装JDK8的步骤:一、下载JDK...
- JDK为什么废弃永久代,而引入元空间
-
今天我们来说说这个JVM的相关知识,因为面试简直是问到麻木的问题,那就是关于JVM的相关知识,今天了不起再次来和大家聊一下这个知识,我们从一些比较奇怪的问题说起,也不说那些经常会问到的内容了,...
- JDK 1.8中对象被访问的具体过程及步骤
-
JDK1.8中对象被访问的过程和步骤对象的创建与初始化当使用new关键字创建一个Java对象时,JVM需要执行以下步骤:...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
【开源分享】2024在线客服系统PHP源码(安装教程+全新UI)
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024php在线客服系统实时聊天系统源码
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)