当前位置: 首页 > news >正文

update case when 多字段,多条件, mysql中case when用法

文章目录
前言
sql示例
普通写法:
update case when写法
update case when 多字段写法
case when语法
case when 的坑
1、不符合case when条件但是字段被更新为null了
解决方法一:添加where条件
解决方法二:添加else 原样输出
2、同一条数据符合第一个case when条件后即返回
3、case when判null问题
解决方法一:
解决方法二:
前言
本篇内容主要讲解如何根据多个条件更新某字段。例如男生年龄大于22岁即更新为到达法定结婚年龄,女生年龄大于20岁即更新为到达法定结婚年龄。在这种需求中,需要根据两个条件更新某个字段;

sql示例
假设用户表user有如下字段,需要根据性别与年龄更新用户是否到达法定结婚年龄。若符合条件则更新到达法定结婚年龄,否则更新为未到达法定结婚年龄

字段名 备注
name 姓名
age 年龄
sex 性别
remark 备注

普通写法:

update  user set remark ='到达法定结婚年龄' where sex = '男' and age >=22;
update  user set remark ='到达法定结婚年龄' where sex = '女' and age >=20;
update  user set remark ='未到达法定结婚年龄' where sex = '男' and age <22;
update  user set remark ='未到达法定结婚年龄' where sex = '女' and age <20;

说明:以上的写法需要四句才能完成此需求,即使做优化,也需要两个sql语句才能完成此需求,是否有一个sql即可满足需求呢,sql中有个case when语法,可以完成此功能。

update case when写法

update user set remark = case 
when sex = '男' and age >=22 then '到达法定结婚年龄'
when sex = '女' and age >=20 then '到达法定结婚年龄'
when sex = '男' and age <22 then '未到达法定结婚年龄'
when sex = '女' and age <20 then '未到达法定结婚年龄'
end
where id <5;

update case when 多字段写法
需求:修改remark字段,要求男生22岁及以上为到达法定结婚年龄否则为未到达法定结婚年龄,女生20岁及以上为到达法定结婚年龄否则为未到达法定结婚年龄,同时修改id=1的name为zhang san ,id=4的name为li si,id=2与3的name维持原样。

UPDATE USER SET remark = CASE 
WHEN sex = '男' AND age >=22 THEN '到达法定结婚年龄'
WHEN sex = '女' AND age >=20 THEN '到达法定结婚年龄'
WHEN sex = '男' AND age <22 THEN '未到达法定结婚年龄'
WHEN sex = '女' AND age <20 THEN '未到达法定结婚年龄'
END ,
NAME = CASE 
WHEN id =1 THEN 'zhang san'
WHEN id=4 THEN 'li si'
ELSE NAME
END 
WHERE id <5;

注意:

case when else 原样输出,则在else后直接写上列名即可
case when用法中,符合where条件的所有数据,都需要用case when枚举列举完,要不就是走到else逻辑中,否则该字段会被更新为null。案例如下:
原数据:

更新id小于5的数据name字段,当id=1更新name为zhang san,当id=4更新name为li si,id=2与3的数据没有用case when,也没有走到else逻辑中,导致name字段更新为null了,结果如下:

UPDATE USER SET 
NAME = CASE 
WHEN id =1 THEN 'zhang san'
WHEN id=4 THEN 'li si'
END 
WHERE id <5;

case when语法
Case具有两种格式。简单Case函数和Case搜索函数。
简单Case函数

CASE [value] 
WHEN [compare_value1] THEN [result1]
WHEN [compare_value2] THEN [result2] …
ELSE [default] 
END

语义:
  将case后面的值value分别和每个when子句后面的值compare_value进行相等比较:
  如果一旦和某个when子句后面的值相等则返回相应的then子句后面的值result;
  如果和所有when子句后面的值都不相等,则返回else子句后面的值;
  如果没有else部分则返回null。
注意:
  ①value可以是表达式或者列名
  ②CASE表达式的数据类型取决于跟在then或else后面的表达式的类型
类型必须相同(可尝试做隐式类型转换),否则出错。

示例:

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

Case搜索函数

CASE 
WHEN [expr1] THEN [result1]
WHEN [expr2] THEN [result2]
WHEN [exprN] THEN [resultN]
ELSE [default] 
END

语义:
  如果某个when子句后面的条件expr为true,则返回相应的when子句后面的值result;
  如果所有的when子句后面的条件expr都不为true,则返回else子句后面的值;
  如果没有else部分则返回null。

示例

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

注意:
1:case只返回第一个符合条件的值,剩下的case部分会被忽略
2:虽然CASE表达式中的ELSE子句可以省略,但还是希望大家不要省略。在一些低版本的mysql中若省略了else分支且所有的when条件都不符合可能会报错。

这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。

case简单函数示例:

– 统计年龄,姓名条件的

select 
count(case age when 10 then age else null end) as age_num,
count(case name when '张三' then name end) as name_num 
from test_list;

case搜索函数示例:

– 统计年龄,姓名条件的

select 
count(case when age between 11 and 22 then age else null end) as age_num,
count(case when name='张三' then name end) as name_num 
from test_list;

case when 排序示例

select * 
from test_list 
order by case when age>10 then sex  end desc;

case when与聚合函数混合使用

SELECT SUM(CASE WHEN sex='男' THEN 1 ELSE 0 END) AS 女生人数,SUM(CASE WHEN sex='女' THEN 1 ELSE 0 END) AS 男生人数
FROM user;

case when 的坑
1、不符合case when条件但是字段被更新为null了
user表原数据如下:

现在要更新id=1与4的name字段,但是用case when后id=2与3的name被更新为null了。符合条件的数据被更新了,不符合条件的数据字段被更新为null了

UPDATE USER SET 
NAME = CASE 
WHEN id =1 THEN 'zhang san'
WHEN id=4 THEN 'li si'
END 

解决方法一:添加where条件

UPDATE USER SET 
NAME = CASE 
WHEN id =1 THEN 'zhang san'
WHEN id=4 THEN 'li si'
END 
where id in (1,4);

解决方法二:添加else 原样输出
不符合case when的数据,走else逻辑,这里else 后面跟上列名,指的是按原来的值更新

UPDATE USER SET 
NAME = CASE 
WHEN id =1 THEN 'zhang san'
WHEN id=4 THEN 'li si'
ELSE name
END 

2、同一条数据符合第一个case when条件后即返回
user表原数据如下:

更新id=1的数据remark字段,当年龄小于22更新为“年龄”,当性别为男更新为“性别”

UPDATE USER SET remark = CASE 
WHEN age <22 THEN '年龄'
WHEN sex = '男' THEN '性别'
END 
WHERE id =1;

可以看到当同一条数据同时满足多个case when时,只会更新为第一个命中的条件。

3、case when判null问题
user表原数据:

在查询时,当remark字段为null时,我们想让其返回为“空”,但是用case when后发现没生效。

SELECT id,NAME,age,sex,
CASE remark 
WHEN '' THEN '空字符串'
WHEN NULL THEN '空'
END
FROM USER 

原理可以看上面的case when语法:

解决方法一:

SELECT id,NAME,age,sex,
CASE  
WHEN remark ='' THEN '空字符串'
WHEN remark IS NULL THEN '空'
END
FROM USER ;

解决方法二:

SELECT id,NAME,age,sex,
CASE  remark IS NULL 
WHEN FALSE THEN '空字符串'
WHEN TRUE THEN '空'
END
FROM USER ;

相关文章:

update case when 多字段,多条件, mysql中case when用法

文章目录 前言 sql示例 普通写法&#xff1a; update case when写法 update case when 多字段写法 case when语法 case when 的坑 1、不符合case when条件但是字段被更新为null了 解决方法一&#xff1a;添加where条件 解决方法二&#xff1a;添加else 原样输出 2、同一条数据符…...

mysql隐式转换 “undefined“字符串匹配到mysql int类型0值字段

描述&#xff1a;mysql 用字符串搜索 能搜到int类型查询结果 mysql int类型条件用字符串查询 table: CREATE TABLE all_participate_records (id bigint unsigned NOT NULL AUTO_INCREMENT,created_at datetime(3) DEFAULT NULL,updated_at datetime(3) DEFAULT NULL,deleted…...

Redis八股文

1.Redis是什么? Redis 是一个基于 C 语言开发的开源数据库&#xff08;BSD 许可&#xff09;&#xff0c;与传统数据库不同的是 Redis 的数据是存在内存中的&#xff08;内存数据库&#xff09;&#xff0c;读写速度非常快&#xff0c;被广泛应用于缓存方向。并且&#xff0c…...

InnoDB——详细解释锁的应用,一致性读,自增长与外键

一致性非锁定读 一致性的非锁定读&#xff08;consistent nonlocking read&#xff09;是指InnoDB存储引擎通过行多版本控制的方式读取当前执行时数据库中行的数据。 如果读取的行正在执行 行Delete或Update操作&#xff0c;这时读取操作不会因此去等待行上锁的释放。相反&…...

C++模板基础(四)

函数模板&#xff08;四&#xff09; ● 函数模板的实例化控制 – 显式实例化定义&#xff1a; template void fun(int) / template void fun(int) //header.h template<typename T> void fun(T x) {std::cout << x << std::endl; }//main.cpp #include&quo…...

pycharm使用记录

文章目录下载安装后续其他设置编辑器设置关于debug下载安装 直接去pycharm官网下载社区版&#xff0c;这个版本本来就是免费的&#xff0c;而且功能其实已经够了 后续其他设置 首先&#xff0c;第一次启动时&#xff0c;记得在preference->interpreter中设置python环境&a…...

Linux命令·kill·killall

Linux中的kill命令用来终止指定的进程&#xff08;terminate a process&#xff09;的运行&#xff0c;是Linux下进程管理的常用命令。通常&#xff0c;终止一个前台进程可以使用CtrlC键&#xff0c;但是&#xff0c;对于一个后台进程就须用kill命令来终止&#xff0c;我们就需…...

Linux /proc/version 文件解析

/proc/version文件里面的内容: Linux version 4.14.180-perf (oe-user@oe-host) (clang version 10.0.5 for Android NDK, GNU ld (GNU Binutils) 2.29.1.20180115) #1 SMP PREEMPT Wed Mar 29 18:55:02 CST 2023 /proc/version文件里面记录了如下内容: 1、Linux kernel的…...

【Django 网页Web开发】15. 实战项目:管理员增删改查,md5密码和密码重置(08)(保姆级图文)

目录1. model编写数据表2. 管理员列表2.1 admin.py视图文件2.2 admin_list.html2.3 url.py2.4 最终效果3. 管理员添加3.0 md5包的书写3.1 form.py表单组件3.2 admin.py视图文件3.3 引入公共的添加数据html3.4 url.py3.5 最终效果4. 管理员编辑4.0 form表单组件4.1 admin.py视图…...

STL容器之<array>

文章目录测试环境array介绍头文件模块类定义对象构造初始化元素访问容器大小迭代器其他函数测试环境 系统&#xff1a;ubuntu 22.04.2 LTS 64位 gcc版本&#xff1a;11.3.0 编辑器&#xff1a;vsCode 1.76.2 array介绍 array是固定大小的序列式容器&#xff0c;它包含按严格…...

flask教程6:cookie和session

文章目录一、cookie1.1 什么是cookie&#xff1f;1.2 使用cookie1.2.1 设置cookie1.2.2设置cookie的有效期1.2.3在Flask中查询cookie1.2.4删除cookie二、session2.1实现session的两种思路2.1.1 第一种2.1.2 第二种2.2使用session2.2 .1设置session2.2.2 设置有效期2.2.3 获取se…...

【JavaEE初阶】第六节.网络原理TCP/IP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、TCP/IP协议五层协议栈&#xff1b; 1.1 应用层协议&#xff1b; 二、传输层协议&#xff1b; 2.1 UDP协议&#xff1b; 2.2 TCP协议&#xff1b; 2.…...

模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)

模式识别 —— 第六章 支持向量机&#xff08;SVM&#xff09;与核&#xff08;Kernel&#xff09; 文章目录模式识别 —— 第六章 支持向量机&#xff08;SVM&#xff09;与核&#xff08;Kernel&#xff09;硬间隔&#xff08;Hard-Margin&#xff09;软间隔&#xff08;Soft…...

总结 synchronized

目录synchronized的特性1. 互斥2. 刷新内存3. 可重入synchronized的使用1. 直接修饰普通方法2. 修饰静态方法3. 修饰代码块synchronized的锁机制基本特点关键锁策略 : 锁升级synchronized的特性 1. 互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized…...

360周鸿祎又“开炮”:GPT 6-8就将产生自主意识!我们来测算一下对错

‍数据智能产业创新服务媒体——聚焦数智 改变商业近日&#xff0c;360的周鸿祎放言“GPT6到GPT8人工智能将会产生意识&#xff0c;变成新的物种。未来&#xff0c;人工智能大语言模型有可能实现自我进化&#xff0c;自动更新系统和自我升级&#xff0c;或者指数级进化能力&am…...

python——飞机大战小游戏

目录 1、导入模块 2、窗口操作 3、事件操作 4、长按事件 5、添加游戏背景 6、添加英雄飞机 7、获取飞机的图片矩形 8、基本游戏窗口 9、添加游戏窗口图片 10、英雄飞机登场 11、英雄飞机装备子弹并发射 1、enemy_plane 2、game_main 3、game_map 4、game_score …...

数组(完全二叉树)向下建堆法与堆排序O(N*logN)

TIPS AdjustUp & AdjustDown向上调整AdjustUp与向下调整AdjustDown的参数是一个数组&#xff08;完全二叉树&#xff09;需要进行调整操作的数值的下标/一个数组&#xff08;完全二叉树&#xff09;堆元素个数需要调整操作的数值的下标。实际上就是对完全二叉树当中的某一点…...

Lua require 函数使用

从 Lua 的用户文档中我们知道 require("modName") 函数是用来加载模块的&#xff0c;而如果这个modName已经用require 加载过的&#xff0c;再调用require时&#xff0c;将直接返回模块的值。因为函数首先查找 package.loaded 表&#xff0c; 检测 modName 是否被加载…...

【面试】如何定位线上问题?

这个面试题我在两年社招的时候遇到过&#xff0c;前几天面试也遇到了。我觉得我每一次都答得中规中矩&#xff0c;今天来梳理复盘下&#xff0c;下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路去答&#xff1a; 1、如果线上出现了问题&#xff0c;我们更多…...

字节二面,原来我对自动化测试的理解太浅了

如果你入职一家新的公司&#xff0c;领导让你开展自动化测试&#xff0c;作为一个新人&#xff0c;你肯定会手忙脚乱&#xff0c;你会如何落地自动化测试呢&#xff1f; 01 什么是自动化 有很多人做了很长时间的自动化但却连自动化的概念都不清楚&#xff0c;这样的人也是很悲…...

Android11.0 应用升级成功后立即断电重启,版本恢复

问题&#xff1a;客户反馈内置的应用升级成功后立刻断电重启&#xff0c;应用的版本被恢复。 使用adb命令升级客户应用&#xff0c;查看版本显示已更新&#xff0c;/data/system目录下packages.xml和packages.xml中应用版本信息均已更新 C:\Users\dell>adb shell dumpsys …...

关于python常用软件用法:Pycharm 常用功能

人生苦短&#xff0c;我用python 一.Pycharm的基本使用 1.在Pycharm下为你的Python项目配置Python解释器 &#xff08;1&#xff09;.Setting>Project Interpreter>源码资料电子书:点击此处跳转文末名片获取 二.在Pycharm下创建Python文件、Python模块 1.File>New&g…...

SOLIDWORKS你不知道的小技巧

◉ SOLIDWORKS圆弧长度标注点智能标注&#xff0c;再选中该圆弧&#xff0c;然后分别点圆弧的两个端点&#xff0c;点击左键可以标注圆弧长度。◉ SOLIDWORKS强力裁剪剪裁实体中的强劲剪裁&#xff0c;除了可以裁剪实体外&#xff0c;还可以任意延伸实体。◉ SOLIDWORKS转折线转…...

有了HTTP,为啥还要用RPC

既然有 HTTP 请求&#xff0c;为什么还要用 RPC 调用&#xff1f; 一直以来都没有深究过RPC和HTTP的区别&#xff0c;不都是写一个服务然后在客户端调用么&#xff1f; HTTP和RPC最本质的区别&#xff0c;就是 RPC 主要是基于 TCP/IP 协议的&#xff0c;而 HTTP 服务主要是基…...

[leetcode] 动态规划

背包 先啃懂 背包九讲 01背包&#xff0c;即物品有限。 for 物品for 容量&#xff08;倒序&#xff09;P1048 [NOIP2005 普及组] 采药 [ 原题 | 题解 ] P1049 [NOIP2001 普及组] 装箱问题 [ 原题 | 题解 ] P1507 NASA的食物计划 [ 原题 | 题解 ] P1510 精卫填海 [ 原题 | 题…...

科大奥瑞物理实验——热电偶特性及其应用研究

实验名称&#xff1a;热电偶特性及其应用研究 1. 实验目的&#xff1a; 掌握电位差计的工作原理和结构特点&#xff1b;了解温差电偶测温的原理和方法&#xff1b;学会电位差计的使用及注意事项。 2. 实验器材&#xff1a; 电位差计 标准电池 光电检流计 稳压电源 温差电偶…...

Eclips快捷键大全(超详细)

Eclips快捷键大全&#xff08;超详细&#xff09;前言一、常用快捷键二、编辑快捷键三、导航快捷键四、运行和调试快捷键五、重构快捷键六、代码生成快捷键七、项目导航快捷键八、帮助快捷键九、搜索快捷键十、标记快捷键十一、版本控制快捷键十二、其它快捷键前言 本博主将用C…...

整懵了,蚂蚁金服4面成功拿下测开offer,涨薪10k,突然觉得跳槽也不是那么难

蚂蚁的面试挺独特的&#xff0c;每轮面试都没有HR约时间&#xff0c;一般是晚上8点左右面试官来一个电话&#xff0c;问是否能面试&#xff0c;能的话开始面&#xff0c;不能就约一个其他时间。 全程4面&#xff0c;前四面技术面&#xff0c;电话面试&#xff0c;最后一面是HR面…...

C++内存分布malloc-free-new-delete的区别和联系

目录 一、内存分布 1.1内存分布图&#xff1a; 1.2 为什么要将bss和data区分开呢&#xff1f; 1.3 堆和栈有什么区别 二、malloc、free&#xff1b;new、delete 2.1 new和delete是如何实现的&#xff0c;new与malloc的异同处 2.2既然有了malloc/free&#xff0c;C为什么还…...

【华为OD机试 2023最新 】 最多颜色的车辆(C++ 100%)

文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 在一个狭小的路口,每秒只能通过一辆车,假设车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 ,1 ,2 输入描述 第一行输入的是通过的车辆颜色信息 [0,1,1,2] 代表4 秒钟通过的车…...