分享一个case when then when then end的sql语句编写用法

news2024/11/22 22:49:21

目录

    • 写作背景
    • 我和若依的前一部分相同思路
    • 我的后续解决思路(不建议)
    • 若依后续解决思路(建议)
    • 若依后续解决思路举例

写作背景

平时我用case when then else end的机会也不多,之前用它来做对select结果进行计算,例如:

select job,ename,(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal*1.8 end) as "newSal" from emp;

上面sql语句的作用是判断job字段的值,然后根据不同的值来计算薪水

今天我在看若依项目,看到里面对部门结构树的移动操作,虽然实际上是修改部门所属组织机构操作,但背后隐藏的是树中结构的移动操作,由于若依在定义部门表的时候添加了一个ancestors字段,其实也就是path字段,存储的是从最高级到当前级别的路径id字符串组合(中间用英文逗号分隔),所以我们在更改某一个部门所属父级的时候,不仅要更新改部门的ancestors字段,也要更新该部门所有子部门的所有ancestors字段,我们看一下页面吧,如下:

在这里插入图片描述
按照上图可以看出,我们要将研发中心下面的长沙分公司移动到若依科技下面,但是长沙分公司下面还有两个子级部门,按照上面的说法,我们不仅需要修改长沙分公司ancestors字段(类型path,全路径id字符串组合),也要更新该部门所有子部门的所有ancestors字段

我和若依的前一部分相同思路

先根据部门id找到长沙分公司以前的ancestors字段值,然后在获取长沙分公司最新的ancestors字段值(先获取到最新父级ancestors字段值,再加上父级id,这就是长沙分公司最新的ancestors字段值了)

根据长沙分公司的id找到所有的子级数据,然后根据上面获取到长沙分公司的新老ancestors字段值进行replace替换

现在我们拿到了所有子级部门最新ancestors字段值,代码逻辑如下:

List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
for (SysDept child : children)
{
    child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
}

我的后续解决思路(不建议)

如果是我的话,我估计会根据部门id去挨个更新,这种方式会和数据库进行多次交互,所以不建议这么做

若依后续解决思路(建议)

直接使用一个update语句更新所有的数据,我们先来看一下代码吧,如下:

java代码:

List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
for (SysDept child : children)
{
    child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
}
if (children.size() > 0)
{
    deptMapper.updateDeptChildren(children);
}

sql文件.xml:

<update id="updateDeptChildren" parameterType="java.util.List">
	update sys_dept set ancestors =
	<foreach collection="depts" item="item" index="index"
		separator=" " open="case dept_id" close="end">
		when #{item.deptId} then #{item.ancestors}
	</foreach>
	where dept_id in
	<foreach collection="depts" item="item" index="index"
		separator="," open="(" close=")">
		#{item.deptId}
	</foreach>
</update>

我们来看一下具体的sql长啥样,如下:

update sys_dept set ancestors = case dept_id when ? then ? when ? then ? end where dept_id in ( ? , ? )

通过上面的sql可以看到,首先先通过where条件找到所有需要更新的数据,然后在更新的时候通过判断dept_id的值在决定ancestors的值,所以一句sql语句可以解决所有的子级分类更新问题,是不是很nice呢

目前若依持久层框架使用的是mybatis,如果我们使用mybatis-plus,那可以使用baseMapper.updateBatchById()方法进行批量更新操作

若依后续解决思路举例

针对上面的情况我们举一个demo吧,假设原有数据长这样:

在这里插入图片描述
我们想把所有sex值为男的age值更新成20,sex值等于女的age值更新成18,sql语句如下:

update t_user 
set age =
	case sex 
		when "男" THEN 20 
		when "女" THEN 18 
	end

最终结果如下,愿望达成

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python代码20行,助力千万SEO从业者快速实现网站分析

Python代码20行&#xff0c;助力千万SEO从业者快速实现网站分析 SEO是现代数字营销的核心战略之一。对于千万从业者而言&#xff0c;网站分析是SEO实践的重要一环。而Python作为一门高效、简洁的编程语言&#xff0c;其丰富的第三方库和易学易用的语法使其成为网站分析的强大工…

【MySQL】从0到1打开数据库管理

目录 前言&#xff1a; 一.认识MySQL 二.安装MySQL数据库 三、启动和停止MySQL服务 3.1启动服务的两种方式 3.2停止服务的两种方式 四.链接客户端 4.1使用自带的命令行窗口 4.2使用系统自带的命令窗口 五.MySQL是存储数据的模型 六.SQL语言 结尾&#xff1a; 前言&a…

设计二:51单片机外部中断控制

目录 一、设计内容 二、中断相关知识 1、51单片机中断源 2、中断系统特殊功能寄存器 3、中断函数与函数调用区别 三、仿真原理图 四、程序设计 五、仿真结果 六、思考题 作者有话说 一、设计内容 本次设计使用2个按键&#xff0c;在无按键按下时&#xff0c;最下面一…

chatgpt赋能python:Python代码50行:如何使用Python进行SEO分析

Python代码50行&#xff1a;如何使用Python进行SEO分析 随着互联网的发展&#xff0c;Search Engine Optimization&#xff08;SEO&#xff09;已经成为企业网络营销策略中至关重要的一环。而Python作为一种全能的编程语言&#xff0c;已经逐渐成为许多SEO工程师的首选工具。本…

chatgpt赋能python:Python修改List的教程

Python修改List的教程 当涉及到Python编程时&#xff0c;对于处理和管理数据&#xff0c;List是一个非常常见和有用的数据结构。像大多数数据结构一样&#xff0c;有时需要对List进行修改&#xff0c;以便更好地满足程序的需求。因此&#xff0c;本文将向您展示如何使用Python…

数据结构与算法09:二叉树

目录 【树】 【二叉树】 二叉树的遍历 Go代码实现 二叉树的复杂度分析 【二叉搜索树】 Go代码实现 【每日一练&#xff1a;移除元素】 【树】 什么是树&#xff1f;这个不用解释了吧&#xff0c;马路两边种的都是树。数据结构里面的“树”和现实生活中的树类似&#…

chatgpt赋能python:Python会动的图形:如何让你的网站活力四射

Python会动的图形&#xff1a;如何让你的网站活力四射 如果你想让你的网站更具生命力、吸引力和互动性&#xff0c;一种非常有效的方式是使用动态图形。而Python有许多强大的库可以帮助你实现这一目标。在本篇文章中&#xff0c;我们将讨论Python会动的图形的好处、如何实现和…

过滤器JavaWeb:Filter与拦截器Spring:Intercepter

过滤器与拦截器若同时存在&#xff0c;先执行过滤器的放行前&#xff0c;再执行整个拦截器&#xff0c;最后再执行过滤器的放行后 过滤器会拦截所有资源&#xff08;包括静态资源&#xff09;&#xff0c;拦截器只会拦截Spring环境的资源 Filter的使用 1、创建一个类implement…

深蓝学院C++基础笔记 第 1 章 C++初探

第 1 章 C初探 1&#xff0e;从Hello World 谈起 Hello World: #include <iostream> int mian() { std::cout << "Hello World!" << std::endl; }函数: 一段能被反复调用的代码&#xff0c;可以接收输入&#xff0c;进行处理并(或)产生输出-返回…

Postgres vs MySQL

主要区别及示例 简而言之&#xff0c;Postgres 和 MySQL 之间的主要区别实际上归结为主索引和辅助索引的实现方式以及数据的存储和更新方式。 让我们进一步探讨这个问题。 但首先... 基础知识 索引是一种数据结构&#xff08;主要是 B 树&#xff09;&#xff0c;允许通过…

DAY01_MySQL基础数据类型navicat使用DDL\DML\DQL语句练习

目录 1 数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL 2 MySQL2.1 MySQL安装2.1.1 安装步骤 2.2 MySQL配置2.2.1 添加环境变量2.2.2 MySQL登录2.2.3 退出MySQL 2.3 MySQL数据模型2.4 MySQL目录结构2.5 MySQL一些命令2.5.1 修改默认账户密码2.5.2…

Linux 计划任务(at与crontab)

一次性计划任务 at Linux 中的【 at 】 命令是用来创建一次性计划任务的&#xff0c; at 命令有一个服务 atd 以后台的模式运行&#xff0c;通过检查当前的时间来决定是 否运行 " 计划 " &#xff0c;默认情况下&#xff0c; atd 服务每 60 秒检 查一次&#x…

【Web服务应用】Nginx服务

Nginx服务 一、Nginx概述1.1Nginx特点1.2Nginx作用1.3Nginx与Apache的差异 二、Nginx进程模型三、编译安装Nginx3.1Nginx服务的检查、启动、停止&#xff0c;重载3.2平滑升级3.3把nginx进程加入到系统服务当中 四、Nginx服务的主配置文件nginx.conf4.1补充什么是IO多路复用4.2根…

R语言:移动平均计算及绘图

问题描述 现在有一个分日期记录DAU的数据&#xff0c;现在需要绘制其360,180,90,30,7日移动平均值&#xff0c;来观测消除了波动干扰的DAU趋势 (实际移动在股价趋势图上非常常见) 原始数据格式如下&#xff1a; day &#xff08;character&#xff09; dau &#xff08;int…

Docker+Jenkins+Gitee自动化部署maven单模块项目

1.简介 各位看官老爷&#xff0c;本文为Jenkins实战&#xff0c;注重实际过程&#xff0c;阅读完会有以下收获&#xff1a; 了解如何使用Docker安装Jenkins了解如何使用Jenkins部署maven项目了解如何使用JenkinsGitee实现自动化部署 2.Jenkins介绍 相信&#xff0c;正在读这…

2023年上半年软件设计师上午真题及答案解析

1.计算机中&#xff0c;系统总线用于( )连接 A.接口和外设 B.运算器&#xff0c;控制器和寄存器 C.主存、外设部件 D.DMA控制器和中断控制器 2.在由高速缓存、主存和硬盘构成的三级存储体系中&#xff0c;CPU执行指令时需要读取数据&#xff0c;那么DMA控制…

深入理解Linux虚拟内存管理(一)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核&#xff08;一&#xff09; 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;三&#xf…

ubantu换配置源

文章目录 1.配置镜像源位置2.进入终端&#xff0c;切换到/home/user/etc/apt/3.默认这个文件是只读的&#xff0c;我们修改一下权限4.修改之前&#xff0c;我们先备份一下系统原来配置的源5.开始修改&#xff0c;打开/etc/apt/sources.list文件&#xff0c;将原来的内容删除&am…

chatgpt赋能python:Python代码怎么打包-全面介绍

Python 代码怎么打包 - 全面介绍 Python 是一种高效、易学易用、灵活多变的编程语言。对于 Python 开发者来说&#xff0c;如何将其编写的程序打包是一个必须掌握的技能。本文将着重介绍 Python 代码打包的方法及其优势&#xff0c;并提供一些实用的工具和技巧。 什么是打包?…

六级备考17天|2017年12月三套真题|翻译与写作|20:45~21:00

目录 第一套 翻译&#xff1a;太湖 中文 英文 词汇 作文 谚语题&#xff1a;respect others, and you will be respected 第二套 翻译&#xff1a;青海湖 中文 英文 词汇 第一套 翻译&#xff1a;太湖 中文 英文 词汇 太湖 Lake Tai 淡水湖 fre…