case when then else_三分钟搞懂SQL的Case函数

前言

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

一: 使用语法

   (一)普通case函数

CASE  
   WHEN 1> THEN 
   WHEN 2> THEN 
   ...
   ELSE 
END 

   (一)搜索case函数

CASE
    WHEN 1> THEN 
    WHEN 2> THEN 
    ...
    ELSE commands
END
作用一: 结合分组统计数据

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

     (一)方式一: 使用普通的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
  )

        统计结果

339651dce4276738c4ee588c738b6477.png

    (二)方式二: 使用搜索的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
 )

  统计结果

d00651fa50d274e0715eb0c385b9e8e8.png

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

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

    可能有人看到这个需求的第一反应,想直接可以直接通过如下两条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
 )

   (三)分条件修改后结果

997c319652feddcc1f272cf22852805f.png

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

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

4e4f9ef417c98b89a0d63c0ac1aed56a.png   

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

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

   (三)比较结果:

d5c6c3c5677b3cb6b0c2b04392b531ea.png

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

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

23d615c42d52faca722798a5c9cbe105.png  

         (二)使用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 ) 英语 FROMt_source GROUP BYNAME
// 使用搜索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

   (三)转换结果

6d12a7d9393b70ccb0019300e893d788.png

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

   通过上面的案例可看到,普通的case函数写法相对简洁,但是功能也相对简单,搜索case函数的功能更加强大,具体如下:

   1、简单case函数判断条件只能是等于,而搜索case函数的条件可以是子查询,In,大于、等于等等。   

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

六:总结

   如果你想亲自实践,需要本文章的测试数据,可以私信回复: 【测试数据】即可。

   看到此处,你应该对Case函数有了更深入的认识,但是、关于Case函数的使用远远不止这一篇文章描述的,还需要我们在实践中去发现更多的可能,如果你看完本文觉得有疑问或者本文有错误的地方,欢迎私信或者在下方留言指出。

   码字不易、如果你觉得本文对你有一点点帮助,可以点赞和关注!e7e4b30960587358d75eb5bc0d76c750.gif

        关注【是秘密呀joy】一个让你提高技术知识的秘密基地!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值