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


    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更好。

    L-Rui
  • 相关阅读:
    php memcache分布式和要注意的问题
    PHP延迟静态绑定(本文属于转发)
    WebSocket实战
    HTML5本地存储(Local Storage) 的前世今生
    HTML5本地存储——IndexedDB
    HTML5 FileReader
    HTML5 FormData对象
    2017-2018-1 20155225 实验四 外设驱动程序设计
    2017-2018-1 20155225 《信息安全系统设计基础》第十一周学习总结
    Linux下的IPC机制
  • 原文地址:https://www.cnblogs.com/Rui6/p/15708528.html
Copyright © 2020-2023  润新知