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示例 普通写法: update case when写法 update case when 多字段写法 case when语法 case when 的坑 1、不符合case when条件但是字段被更新为null了 解决方法一:添加where条件 解决方法二:添加else 原样输出 2、同一条数据符…...
mysql隐式转换 “undefined“字符串匹配到mysql int类型0值字段
描述: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 语言开发的开源数据库(BSD 许可),与传统数据库不同的是 Redis 的数据是存在内存中的(内存数据库),读写速度非常快,被广泛应用于缓存方向。并且,…...
InnoDB——详细解释锁的应用,一致性读,自增长与外键
一致性非锁定读 一致性的非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过行多版本控制的方式读取当前执行时数据库中行的数据。 如果读取的行正在执行 行Delete或Update操作,这时读取操作不会因此去等待行上锁的释放。相反&…...
C++模板基础(四)
函数模板(四) ● 函数模板的实例化控制 – 显式实例化定义: 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官网下载社区版,这个版本本来就是免费的,而且功能其实已经够了 后续其他设置 首先,第一次启动时,记得在preference->interpreter中设置python环境&a…...
Linux命令·kill·killall
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用CtrlC键,但是,对于一个后台进程就须用kill命令来终止,我们就需…...
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介绍头文件模块类定义对象构造初始化元素访问容器大小迭代器其他函数测试环境 系统:ubuntu 22.04.2 LTS 64位 gcc版本:11.3.0 编辑器:vsCode 1.76.2 array介绍 array是固定大小的序列式容器,它包含按严格…...
flask教程6:cookie和session
文章目录一、cookie1.1 什么是cookie?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协议
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、TCP/IP协议五层协议栈; 1.1 应用层协议; 二、传输层协议; 2.1 UDP协议; 2.2 TCP协议; 2.…...
模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)
模式识别 —— 第六章 支持向量机(SVM)与核(Kernel) 文章目录模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)硬间隔(Hard-Margin)软间隔(Soft…...
总结 synchronized
目录synchronized的特性1. 互斥2. 刷新内存3. 可重入synchronized的使用1. 直接修饰普通方法2. 修饰静态方法3. 修饰代码块synchronized的锁机制基本特点关键锁策略 : 锁升级synchronized的特性 1. 互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized…...
360周鸿祎又“开炮”:GPT 6-8就将产生自主意识!我们来测算一下对错
数据智能产业创新服务媒体——聚焦数智 改变商业近日,360的周鸿祎放言“GPT6到GPT8人工智能将会产生意识,变成新的物种。未来,人工智能大语言模型有可能实现自我进化,自动更新系统和自我升级,或者指数级进化能力&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的参数是一个数组(完全二叉树)需要进行调整操作的数值的下标/一个数组(完全二叉树)堆元素个数需要调整操作的数值的下标。实际上就是对完全二叉树当中的某一点…...
Lua require 函数使用
从 Lua 的用户文档中我们知道 require("modName") 函数是用来加载模块的,而如果这个modName已经用require 加载过的,再调用require时,将直接返回模块的值。因为函数首先查找 package.loaded 表, 检测 modName 是否被加载…...
【面试】如何定位线上问题?
这个面试题我在两年社招的时候遇到过,前几天面试也遇到了。我觉得我每一次都答得中规中矩,今天来梳理复盘下,下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路去答: 1、如果线上出现了问题,我们更多…...
字节二面,原来我对自动化测试的理解太浅了
如果你入职一家新的公司,领导让你开展自动化测试,作为一个新人,你肯定会手忙脚乱,你会如何落地自动化测试呢? 01 什么是自动化 有很多人做了很长时间的自动化但却连自动化的概念都不清楚,这样的人也是很悲…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
