zoukankan      html  css  js  c++  java
  • oracle 批量更新之update case when then

    oracle 批量更新之update case when then

    CreationTime--2018年8月7日15点51分

    Author:Marydon

    1.情景描述

      根据表中同一字段不同情况下的值修改为对应的内容,如何实现?

      使用case when then else end语句。

    2.错误用法

      没有else语句,将会导致全表更新

      证实:

      

      结果展示:

      说明:更新的是全表记录,而不是更新的只是符合上面三种情况的记录;

      不在情况范围内的,执行的是将该字段值置空,sql语句相当于:

    UPDATE BASE_AC_MODULE_BAK T
       SET T.MODULEICON = CASE
                            WHEN T.MODULEICON = '/commons/images/img/add.gif' THEN
                             '/commons/images/img/add.png'
                            WHEN T.MODULEICON = '/commons/images/img/edit.gif' THEN
                             '/commons/images/img/update.png'
                            WHEN T.MODULEICON = '/commons/images/img/delete.gif' THEN
                             '/commons/images/img/delete.png'
                            ELSE
                             NULL
                          END  

    3.case when then else end语法

      用法一:简单case语句

    CASE SEX  
    WHEN '1' THEN '男'  
    WHEN '2' THEN '女'  
    ELSE '其他' END  

      用法二:case搜索语句

    CASE WHEN SEX = '1' THEN '男'
    WHEN SEX = '2' THEN '女' 
    ELSE '其他' END

      用法说明:

      与java的switch语句不同是,如果不声明ELSE语句,oracle会自动添加ELSE语句(ELSE NULL),当数据出现与case的情况都不匹配时,

      显示的不是原数据,而是空值;

      必须有END关键词声明结束CASE语句;

      另外,需特别注意的是:使用CASE语句,无论是查询还是修改语句,在不加限制条件的情况下,默认是对全表进行操作!

    4.正确用法

      方法一

    UPDATE BASE_AC_MODULE_bak T
       SET T.MODULEICON = CASE
                            WHEN T.MODULEICON = '/commons/images/img/add.gif' THEN
                             '/commons/images/img/add.png'
                            WHEN T.MODULEICON = '/commons/images/img/edit.gif' THEN
                             '/commons/images/img/update.png'
                            WHEN T.MODULEICON = '/commons/images/img/delete.gif' THEN
                             '/commons/images/img/delete.png'
                            ELSE
                             T.MODULEICON
                          END
     WHERE (T.MODULEICON = '/commons/images/img/add.gif' OR
           T.MODULEICON = '/commons/images/img/delete.gif' OR
           T.MODULEICON = '/commons/images/img/edit.gif')
    

      else为什么可以省略?

      更新加上限制条件后,只有16条数据符合要求并进行修改,不存在else的情况。

      方法二:限制条件加在where后,多个条件之间使用or

    UPDATE BASE_AC_MODULE_BAK T
       SET T.MODULEICON = DECODE(T.MODULEICON,
                                 '/commons/images/img/add.gif',
                                 '/commons/images/img/add.png',
                                 '/commons/images/img/edit.gif',
                                 '/commons/images/img/update.png',
                                 '/commons/images/img/delete.gif',
                                 '/commons/images/img/delete.png')
     WHERE (T.MODULEICON = '/commons/images/img/add.gif' OR
           T.MODULEICON = '/commons/images/img/delete.gif' OR
           T.MODULEICON = '/commons/images/img/edit.gif')

      

  • 相关阅读:
    [51nod] 1301 集合异或和
    [BZOJ] 1088: [SCOI2005]扫雷Mine
    [LUOGU] P4251 [SCOI2015]小凸玩矩阵
    8.21模拟赛
    [BZOJ] 3163: [Heoi2013]Eden的新背包问题
    [BZOJ] 1001: [BeiJing2006]狼抓兔子
    【NOIP2017提高A组冲刺11.8】好文章
    [BZOJ] 1520: [POI2006]Szk-Schools
    [BZOJ] 1877: [SDOI2009]晨跑
    day23(事务管理)
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/9437603.html
Copyright © 2011-2022 走看看