• SQL中的case then的使用(select、update、insert、delete中各自使用)


    1. 前言

    1. 在工作一段时间后发现,有时候有些事情可以让SQL帮我们做好,并不用傻傻把数据拿到java内存中,再用java进行处理,总结就是:能用一条SQL解决的事情,为什么还要在java程序做过多的处理。
    2. 而写SQL的时候,发现sql中的case then也挺好用的,于是把case then的在各个crud中的如何进行操作给记录下来。

    2. 先说结论

    1. case then格式写法:

    ```sql
    // 第一种写法
    CASE 
    WHEN 列名 = 条件值  THEN 值1
    WHEN 列名 = 条件值2 THEN 值2
    WHEN 列名 = 条件值3 THEN 值3
    ELSE 值4 END
    
    // 第二种写法 可以把列名取出,这种情况用于只有一个列名作为条件的情况
    CASE 列名 
    WHEN 条件值  THEN 值1
    WHEN 条件值2 THEN 值2
    WHEN 条件值3 THEN 值3
    ELSE 值4 END
    
    // 第三种写法,可以无需ELSE 但要求一定会满足WHEN其中一条,否则可能就是NULL了
    CASE 
    WHEN 列名 = 条件值  THEN 值1
    WHEN 列名 = 条件值2 THEN 值2
    WHEN 列名 = 条件值3 THEN 值3
    END
    ```
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    2. case then在 crud的写法

    select name,
           sex,
           case when age >= 18 then '成年人'else '未成年'end age
    from people
    
    insert into people(name,sex,age,hobby)
    values('小刚','男','18',case when '男'='男' then '打篮球' end);
    
    update people set hobby = (case when #{A} = 1 then '跳绳' 
    	                            when #{A} = 2 then '打篮球' 
    	                            else hobby 
    	                       end)
    where 其他条件;
    
    delete people where age = (case when #{A} = 'eighteen' then '18' 
                                    when #{A} = 'seventeen' then '17'
                               end);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3. 举例子

    1. 前提准备

    1. 先准备好数据(我使用oracle数据库,由于本人电脑无安装数据库,使用支持在线写SQL的Oracle学习免费网站)

      CREATE TABLE people  (
        name varchar2(200),
        sex varchar2(200),
        age varchar2(200),
        hobby varchar2(200)
      );
      INSERT INTO people VALUES ('小明', '男', '18','');
      INSERT INTO people VALUES ('小红', '女', '17','');
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      在这里插入图片描述

    2. select 中使用

    1. 查询出people表中全部数据,并age大于等于18输出为成年人,小于18输出未成年。

      select name,
             sex,
             case when age >= 18 then '成年人'else '未成年'end age
      from people
      
      • 1
      • 2
      • 3
      • 4

      在这里插入图片描述

    3. insert 中使用

    1. 在使用mybatis的使用,通常都是会将值传入给SQL中,有时候可以根据传入的值设置其他字段的值。

    2. 如下:插入两条数据,如果性别是男生的话,全部hobby都写入打篮球。

      // 解析一下,在myabtis中如下:
      insert into people(name,sex,age,hobby)
      values(#{name},#{sex},#{age},case when #{sex}='男' then '打篮球' end);
      
      insert into people(name,sex,age,hobby)
      values('小刚','男','18',case when '男'='男' then '打篮球' end);
            
      insert into people(name,sex,age,hobby)
      values('小紫','女','18',case when '女'='男' then '打篮球' end);
      
      select * from people
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      在这里插入图片描述

    4. update 中使用

    1. 将全部性别为女的爱好都设置为跳绳。

      // 这里意思: 设置表people中hobby字段,
      // 如果性别是女,则hobby字段设置为跳绳,
      // 否则就使用本身表hobby字段的值进行更新,即保持原来表中的值
      update people set hobby = (case when sex = '女' then '跳绳' else hobby end);
      
      • 1
      • 2
      • 3
      • 4

      在这里插入图片描述

      	
      // 当然上述的sql可以转化为:
      update people set hobby =  '跳绳' where sex = '女';
      
      // 想必大家肯定是使用第二种的sql书写,原因是这里的条件刚刚好是表里面字段内容
      // 如果 java代码中,传入的参数不是sex,而是其他的,比如:
      // 传入A,如果A=1则hobby更新为跳绳,A=2则hobby更新为打篮球
      update people set hobby = (case when #{A} = 1 then '跳绳' 
      	                            when #{A} = 2 then '打篮球' 
      	                            else hobby 
      	                       end)
      where 其他条件;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

    5. delete 中使用

    1. 其实在delete中比较少使用case then,毕竟条件都可以写到where 里面了,当然也是少不了,跟我上述update例子中解释的,可能传入的参数完全跟表对不上情况:

    2. 传入参数A,如果是eighteen删除年龄是18岁的人,如果是seventeen删除年龄是17岁的人

      delete people where age = (case when #{A} = 'eighteen' then '18' 
                                      when #{A} = 'seventeen' then '17'
                                 end);
      
      • 1
      • 2
      • 3

      在这里插入图片描述

    4. 总结

    1. case then 其实就是相当于java中的if else语句
    2. 使用case then主要是解决一些多种情况的选择。
    3. 一般其实不建议使用这样子的sql语句,毕竟会使sql具有唯一性,且带有写死的字符串。
    4. 但有时候这样子操作确实会实现功能非常简单的话,就得掂量掂量一下。
  • 相关阅读:
    基于交叉算子和非均匀变异算子的飞蛾扑火优化算法-附代码
    JUC-ReentrantLock 源码
    MySQL函数运用
    mfc140u.dll是什么文件?mfc140u放在哪个文件夹?详细修复教程
    mysql数据库及一些基本操作
    cesium 实现地图环境功能 - 雨,雪,雾特效
    公链常用的共识算法
    linux下的文本处理工具awk学习
    史诗级PCL和Eigen联合BUG
    关于conda、虚拟环境、镜像通道、pip、pycharm解释器配置的一些总结
  • 原文地址:https://blog.csdn.net/xueyijin/article/details/126815473