前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三分钟掌握case...when的使用

三分钟掌握case...when的使用

作者头像
IT学习日记
发布2022-09-13 11:09:22
7230
发布2022-09-13 11:09:22
举报
文章被收录于专栏:IT知识进阶学习

温馨提示: 本文大约1732字,阅读完大概需要2-3分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,如果觉的文章给你带来一点帮助,可以帮忙点一下赞和关注,谢谢!!

前言

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

一: 使用语法

(一)普通case函数

代码语言:javascript
复制
CASE  <表达式>
   WHEN <值1> THEN <操作>
   WHEN <值2> THEN <操作>
   ...
   ELSE <操作>
END 

(一)搜索case函数

代码语言:javascript
复制
CASE
    WHEN <条件1> THEN <命令>
    WHEN <条件2> THEN <命令>
    ...
    ELSE commands
END

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

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

国家人口
国家人口

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

代码语言:javascript
复制
        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函数进行统计

代码语言:javascript
复制
    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
    )

方式二统计结果

搜索case的统计结果
搜索case的统计结果

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

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

源数据
源数据

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

代码语言:javascript
复制
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函数不能判断带范围的条件)

代码语言:javascript
复制
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函数不能判断带范围的条件)

代码语言:javascript
复制
select name,
(
    case 
    when desciption in(select description from t_user2) then '一致'
    else '不一致'
    end
) 比较结果
from t_user1

(三)比较结果:

字段比较结果
字段比较结果

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

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

源数据
源数据

(二)使用case函数转换

代码语言:javascript
复制
// 使用普通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更好。

六:总结

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 一: 使用语法
      • 作用一: 结合分组统计数据
        • 作用二: 分条件更新字段值
          • 作用三: 检查表中字段值是否一致
            • 作用四: 行转列(重点-面试常见)
              • 五:普通case函数和搜索case函数的区别
                • 六:总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档