sql列中数据通过逗号分割的集合,按需求剔除部分值

news2025/6/9 23:24:14

前置

不会REGEXP 方法的需要在这里学习一下下
记sql字段逗号分隔,通过list查询

功能点

现有一个表格中一列存储的是标签的集合,通过逗号分割
入下:
在这里插入图片描述
其中tag_ids是逗号分割的标签,现在需要删除标签组中的一些标签,因此,该关联表中需要同步删除掉标签的id,例如删除标签组的[1,5,7],如何处理后,保存id是1 的数据的tag_ids保留数据为[2,3,4,6]

分析

首先,要将tag_ids 的“,”进行补全,然后就可以先通过 “1,”、“5,”、“7,”进行字符串截取,然后再将添加的“,” 剔除掉
引入函数TRIM

TRIM([LEADING | TRAILING | BOTH] [trim_character] FROM string)

LEADING:仅去除字符串开头的指定字符。
TRAILING:仅去除字符串结尾的指定字符。
BOTH:去除字符串开头和结尾的指定字符(默认行为)。
trim_character:要移除的字符。如果省略,则默认为空格。
string:要处理的字符串。
例如:

TRIM(BOTH ',' FROM CONCAT(',', tag_ids, ','))

我们插入的两个逗号通过trim删除掉了
在这里插入图片描述
ok,接下来就是如何剔除[1,5,7]了,我们需要引入函数REPLACE

REPLACE(string, old_substring, new_substring)

string:要处理的原始字符串。
old_substring:要被替换的子字符串。
new_substring:用于替换的子字符串。如果 new_substring 是一个空字符串,那么 old_substring 将被删除。

 REPLACE(CONCAT(',', tag_ids, ','), ",1,", ",")

在这里插入图片描述
如上图,我们已经剔除“1”了,如何剔除 5,7,在这里提供一个方法,不代表这个发方法是最优方法
使用REPLACE进行嵌套

SELECT TRIM(BOTH ',' FROM REPLACE(
			REPLACE(
					REPLACE(
							CONCAT(',', tag_ids, ','), 
							',1,', ','
					), ',5,', ','
			), 
			',7,', ','
		)) new_str FROM DUAL

在这里插入图片描述
由此,这个方法是可行的,那么开始使用xml的传参进行写

实现

 <update id="changCustomerTag">
     update scrm_customer c
     set c.tag_ids = TRIM(BOTH ',' FROM
     <foreach collection="tagIds">
         REPLACE(
     </foreach>
     CONCAT(',', c.tag_ids, ','),
     <foreach collection="tagIds" item="tagId" separator="),">
         concat(',', #{tagId},','), ','
     </foreach>
         ))
     where c.tag_ids regexp  concat('(^|,)',
         <foreach collection="tagIds"  item="tagId" open="(" separator="|" close=")">
             #{tagId}
         </foreach>
         , '(,|$)')
 </update>
   void changCustomerTag(@Param("tagIds") List<Long> tagIds);

如果你的项目不支持xml,也可以写存储过程

DROP PROCEDURE IF EXISTS ChangeCustomerTag;
CREATE PROCEDURE ChangeCustomerTag(IN tagIds VARCHAR(255))
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE tagId VARCHAR(255);
    DECLARE tagIdList TEXT DEFAULT '';
    DECLARE tempList TEXT DEFAULT '';
		-- 创建游标
		DECLARE cur CURSOR FOR SELECT * FROM (
		-- WITH RECURSIVE 创建数字类型,根据逗号数量得出数据数量
		WITH RECURSIVE numbers AS (SELECT 1 AS n UNION ALL SELECT n + 1 FROM numbers WHERE n < (LENGTH(tagIds) - LENGTH(REPLACE(tagIds, ',', ''))) + 1)
		-- 得出传入的每一个值
		SELECT SUBSTRING_INDEX(SUBSTRING_INDEX( tagIds , ',',n), ',', -1) tagId FROM numbers) t;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	
    OPEN cur;
 
    read_loop: LOOP
        FETCH cur INTO tagId;
				
        IF done THEN
            LEAVE read_loop;
        END IF;
				
        IF tempList = '' THEN
            SET tempList = CONCAT('CONCAT(\','', c.tag_ids, \',\')');
        END IF;
				-- 拼接sql
				SET tagIdList = CONCAT( 'REPLACE(', IF(tagIdList = '',tempList,tagIdList), ', CONCAT( \',\',', tagId, ',\',\' ),\',\')');
    END LOOP;
 
    CLOSE cur;
 
    SET @sql = CONCAT('UPDATE scrm_customer c
                      SET c.tag_ids = TRIM(BOTH \',\' FROM ', tagIdList, ')
                      WHERE c.tag_ids REGEXP CONCAT(\'(^|)\', (', REPLACE(tagIds, ',', '|'), '), \'(,|$)\')');

		-- 动态创建sql语句
    PREPARE stmt FROM @sql;
		-- 执行sql语句
    EXECUTE stmt;
		-- 释放语句
    DEALLOCATE PREPARE stmt;
END;
CALL ChangeCustomerTag('1,5,7');

原数据
在这里插入图片描述
执行后数据
在这里插入图片描述

最后

主要是自己懒得弄分表,就这样凑合用吧。
有更佳方案或者新奇想法的同学可以分享一下。
该文章为原创,未经允许禁止转载,谢谢

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

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

相关文章

下一代设备健康管理解决方案:基于多源异构数据融合的智能运维架构

导语&#xff1a; 在工业4.0深度演进的关键节点&#xff0c;传统设备管理面临数据孤岛、误诊率高、运维滞后三大致命瓶颈。本文解析基于边缘智能与数字孪生的新一代解决方案架构&#xff0c;并实测验证中讯烛龙PHM-X系统如何通过多模态感知→智能诊断→自主决策闭环&#xff0c…

深入理解JavaScript设计模式之闭包与高阶函数

目录 前言小序一场失败面试面试后的觉醒 闭包变量作用域&#xff1a;谁的地盘听谁的变量的生命周期&#xff1a;该走了&#xff0c;不该走的还在闭包的更多作用&#xff1a;不只是谈恋爱&#xff0c;还能干活&#xff01;1、封装私有变量&#xff1a;你的变量我来守护2、延长变…

springboot启动mapper找不到方法对应的xml

数据源配置 目录结构 idea中mapper.java 可以找到对应的mapper.xml文件 启动却找不到 因为mapper.db1会被识别为文件名 而非目录结构 调整为这种

MQTT协议:物联网时代的通信基石

MQTT协议&#xff1a;物联网时代的通信基石 在当今快速发展的物联网&#xff08;IoT&#xff09;时代&#xff0c;设备之间的通信变得尤为重要。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议作为一种轻量级的消息传输协议&#xff0c;正逐渐成为物联…

Electron通信流程

前言 今天讲Electron框架的通信流程&#xff0c;首先我们需要知道为什么需要通信。这得益于Electron的多进程模型&#xff0c;它主要模仿chrome的多进程模型如下图&#xff1a; 作为应用开发者&#xff0c;我们将控制两种类型的进程&#xff1a;主进程和渲染器进程 。 …

华为云Flexus+DeepSeek征文|华为云Flexus服务器dify平台通过自然语言转sql并执行实现电商数据分析

目录 前言 1 华为云Flexus服务器部署Dify平台 1.1 华为云Flexus服务器一键部署Dify平台 1.2 设置账号登录Dify&#xff0c;进入平台 2 构建自然语言转SQL并执行的应用 2.1 创建应用并启动工作流设计 2.2 应用框架设计 2.3 自然语言转SQL模块详解 2.4 代码执行模块实现…

IDEA中微服务指定端口启动

在使用IDEA开发SpringBoot微服务时&#xff0c;经常需要开启多个服务实例以测试负载均衡&#xff0c;以下几种方法开启不同端口。 直接在配置文件中指定 # application.propertiesserver.port8001指定VM参数 点击Modify options&#xff0c;选择Add VM options&#xff0c;值…

Spring Cloud Alibaba Seata安装+微服务实战

目录 介绍核心功能三层核心架构安装微服务实战创建三个业务数据库编写库存和账户两个Feign接口订单微服务 seata-order-service9701库存微服务 seata-store-service9702账户微服务 seata-account-service9703测试结果 总结 介绍 Spring Cloud Alibaba Seata 是一款开源的分布式…

FMC STM32H7 SDRAM

如何无痛使用片外SDRAM? stm32 已经成功初始化了 STM32H7 上的外部 SDRAM&#xff08;32MB&#xff09; 如何在开发中无痛使用SDRAM 使它像普通 RAM 一样“自然地”使用? [todo] 重要 MMT(Memory Management Tool) of STM32CubeMx The Memory Management Tool (MMT) disp…

部署DNS从服务器

部署DNS从服务器的目的 DNS域名解析服务中&#xff0c;从服务器可以从主服务器上获得指定的区域数据文件&#xff0c;从而起到备份解析记录与负载均衡的作用&#xff0c;因此通过部署从服务器可以减轻主服务器的负载压力&#xff0c;还可以提升用户的查询效率。 注意&#xf…

Android Camera Hal中通过Neon指令优化数据拷贝

背景描述&#xff1a; Camera apk普通相机模式录像操作时&#xff0c;一般是同时请求两个流&#xff0c;即预览流和录像流。对于两个流输出图像格式和分辨率相同的情况下&#xff0c;是不是可以通过一个流拷贝得到另一个流的数据&#xff0c;进而节省掉一个Sensor输出处理两次…

C# winform教程(二)----button

一、button的使用方法 主要使用方法几乎都在属性内&#xff0c;我们操作也在这个界面 二、作用 用户点击时触发事件&#xff0c;事件有很多种&#xff0c;可以根据需要选择。 三、常用属性 虽然属性很多&#xff0c;但是常用的并不多 3.常用属性 名称内容含义AutoSize自动调…

Python编码格式化之PEP8编码规范

文章目录 概要PEP8编码风格py文本组织规范命名规范编码风格 PEP8编码检查工具pylintflake8PyCharm中配置检查工具 PEP8编码格式化工具blackautopep8PyCharm配置格式化工具本地git配置hook 总结 概要 在Python项目开发过程中&#xff0c;代码的可读性和一致性对于项目的长期维护…

【Zephyr 系列 14】使用 MCUboot 实现 BLE OTA 升级机制:构建安全可靠的固件分发系统

🧠关键词:Zephyr、MCUboot、OTA 升级、BLE DFU、双分区、Bootloader、安全固件管理 📌面向读者:希望基于 Zephyr 为 BLE 设备加入安全 OTA 升级功能的开发者 📊预计字数:5200+ 字 🧭 前言:为什么你需要 OTA? 随着设备部署数量增多与产品生命周期延长,远程升级(…

K8S认证|CKS题库+答案| 8. 沙箱运行容器 gVisor

目录 8. 沙箱运行容器 gVisor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、官网找模板 3&#xff09;、创建 RuntimeClass 4&#xff09;、 将命名空间为 server 下的 Pod 引用 RuntimeClass 5&#xff09…

Selenium4+Python的web自动化测试框架

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…

【论文解读】MemGPT: 迈向为操作系统的LLM

1st author: Charles Packer paper MemGPT[2310.08560] MemGPT: Towards LLMs as Operating Systems code: letta-ai/letta: Letta (formerly MemGPT) is the stateful agents framework with memory, reasoning, and context management. 这个项目现在已经转化为 Letta &a…

vb监测Excel两个单元格变化,达到阈值响铃

需求 在Excel中实现监控两个单元格之间的变化范围&#xff0c;当达到某个设定的值的范围内时&#xff0c;实现自动响铃提示。 实现&#xff1a; 首先设置Excel&#xff0c;开启宏、打开开发者工具&#xff0c;点击visual Basic按钮&#xff0c;然后在左侧双击需要监测的shee…

node 进程管理工具 pm2 的详细说明 —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录 7

前言 我以 Ubuntu Server 打造的 NodeJS 服务器为主题的系列文章&#xff0c;经过五篇博客&#xff0c;我们顺利的 安装了 ubuntu server 服务器&#xff0c;并且配置好了 ssh 免密登录服务器&#xff0c;安装好了 服务器常用软件安装, 配置好了 zsh 和 vim 以及 通过 NVM 安装…

Flask与Celery 项目应用(shared_task使用)

目录 1. 项目概述主要功能技术栈 2. 项目结构3. 环境设置创建虚拟环境并安装依赖主要依赖 4. 应用配置Flask应用初始化 (__init__.py)Celery应用初始化 (make_celery.py) 5. 定义Celery任务 (tasks.py)任务说明 6. 创建API端点 (views.py)API端点说明 7. 前端界面 (index.html)…