SQL之CASE WHEN用法进阶——Update语句使用case更新、数据对比(三)

SQL之CASE WHEN基础用法详解(一)

SQL之CASE WHEN用法进阶——where语句后跟case语句(二)

SQL之CASE WHEN用法进阶——Update语句使用case更新、数据对比(三)

前言

作用: 可以使用它们在数据库进行判断功能,跟代码中的if...else功能一样.但是,它们又存在差异,下面就来讲它们的具体作用和差别。

一: 使用语法

(一)普通case函数

CASE <表达式> WHEN <值1> THEN <操作> WHEN <值2> THEN <操作> ... ELSE <操作> END

(一)搜索case函数

CASE WHEN <条件1> THEN <命令> WHEN <条件2> THEN <命令> ... ELSE commands END

作用一: 结合分组统计数据

需求: 将下图的数据按照"洲"进行统计总人数

(一)方式一: 使用普通的case函数进行统计

select ( case name when '中国' then '亚洲' when '日本' then '亚洲' when '美国' then '北美洲' when '加拿大' then '北美洲' else '其他' end ) 洲, sum(population) 总数 from t_country GROUP BY ( case name when '中国' then '亚洲' when '日本' then '亚洲' when '美国' then '北美洲' when '加拿大' then '北美洲' else '其他' end )

方式一统计结果

 

(二)方式二: 使用搜索的case函数进行统计

select ( case when name in('中国','日本') then '亚洲' when name in('美国','加拿大') then '北美洲' else '其他' end ) 洲, sum(population) 总数 from t_country GROUP BY ( case when name in('中国','日本') then '亚洲' when name in('美国','加拿大') then '北美洲' else '其他' end )

方式二统计结果

 

作用二: 分条件更新字段值

(一)需求: 将工资低于3000的员工涨幅工资20%,工资等于高于3000的员工涨幅8%,数据如下:

可能有人看到这个需求的第一反应,想直接可以直接通过如下两条update语句直接更新:

update t_salary set salary = salary + (salary * 0.2) where salary < 3000; update t_salary set salary = salary + (salary * 0.08) where salary >= 3000;

但是,如果是这样执行的话实际上会存在问题,比如:原来工资在2900的员工,执行完第一条语句后工资会变成3480,此时,再执行第二条更新语句,因为满足工资大于三千,则又会去添加多8%的工资,这样明显就是不符合我们的需求的,所以,如果想完成这个需求,又不想写太复杂的sql,可以通过case函数完成这个功能。

(二)使用搜索的case函数进行分条件修改(此处不能使用简单case函数,因为简单case函数不能判断带范围的条件)

update t_salary set salary = ( case when salary < 3000 then salary + salary * 0.2 when salary >= 3000 then salary + salary * 0.08 else salary end )

(三)分条件修改后结果

作用三: 检查表中字段值是否一致

(一)需求: 判断两个表中name字段值是否一致,并返回结果,数据如下:

 

(二)使用搜索的case函数进行分条件修改(此处不能使用简单case函数,因为简单case函数不能判断带范围的条件)

select name, ( case when desciption in(select description from t_user2) then '一致' else '不一致' end ) 比较结果 from t_user1

(三)比较结果:

作用四: 行转列(重点-面试常见)

(一)需求: 将表中数据按照每个学生姓名 、科目、成绩进行排序,数据如下:

(二)使用case函数转换

// 使用普通case函数 SELECT NAME, max( CASE class WHEN '语文' THEN grade ELSE 0 END ) 语文, max( CASE class WHEN '数学' THEN grade ELSE 0 END ) 数学, max( CASE class WHEN '英语' THEN grade ELSE 0 END ) 英语 FROM t_source GROUP BY NAME // 使用搜索case函数 SELECT NAME, max( CASE WHEN class = '语文' THEN grade ELSE 0 END ) 语文, max( CASE WHEN class = '数学' THEN grade ELSE 0 END ) 数学, max( CASE WHEN class = '英语' THEN grade ELSE 0 END ) 英语 FROM t_source GROUP BY NAME

(三)转换结果

五:普通case函数和搜索case函数的区别

通过上面的案例可看到,普通的case函数写法相对简洁,但是功能也相对简单,搜索case函数的功能更加强大,具体如下:
1、简单case函数判断条件只能是等于,而搜索case函数的条件可以是子查询,In,大于、等于等等。

2、如果只是使用简单的条件分组,可以选择普通case函数,如果需要判断更多的场景,则选择搜索case更好。


__EOF__

本文作者Ray
本文链接https://www.cnblogs.com/Rui6/p/15708528.html
关于博主:分享、记录日常遇到的问题合集!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   大白菜!  阅读(5951)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示