MySQL查询字段实现字符串分割split功能的示例代码

 更新时间:2022年01月17日 11:18:03   作者:唯空城  
本文主要介绍了MySQL查询字段实现字符串分割split功能的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

问题背景

查询MySQL中用逗号分隔的字段【a,b,c】是否包含【a】

场景模拟

现有表【ec_logicplace】,如下图所示:

要求判断数值【1】是否存在于表【ec_logicplace】中的【actual_place_id】中

方法实现

首先将【actual_place_id】字段用逗号拆分查询出来

 通用模板为:

SELECT
	SUBSTRING_INDEX( SUBSTRING_INDEX( 'a,b,c', ',', help_topic_id + 1 ), ',',- 1 ) AS num 
FROM
	mysql.help_topic 
WHERE
	help_topic_id < LENGTH( 'a,b,c' ) - LENGTH( REPLACE ( 'a,b,c', ',', '' ) ) + 1

上述所用的关键字包含【SUBSTRING_INDEX】,【LENGTH】,【REPLACE】。

SUBSTRING_INDEX

用于字符串拆分,格式为:

SUBSTRING_INDEX(str,delim,count)

参数含义
str需要拆分的字符串
delim分隔符,通过某字符进行拆分
count当 count 为正数,取第 n 个分隔符之前的所有字符; 当 count 为负数,取倒数第 n 个分隔符之后的所有字符。

举例:

获取第二个以“,”逗号为分隔符之前的所有字符

SUBSTRING_INDEX('a,b,c',',',2)

获取倒数第二个以“,”逗号为分隔符之前的所有字符

SUBSTRING_INDEX('a,b,c',',',-2)

LENGTH

获取字符串的长度,格式为:

LENGTH(str)

参数含义
str需要计算长度的字符串

举例:

获取’a,b,c‘字符串的长度

LENGTH('a,b,c')

REPLACE

替换函数,格式为:

replace(str,from_str,to_str)
参数含义
str需要进行替换的字符串
from_str需要被替换的字符串
to_str需要替换的字符串

举例:

将分隔符“,”逗号替换成“、”顿号

REPLACE('a,b,c',',','、')

SQL解析

此处用的是MySQL库的help_topic 表的help_topic_id 来作为变量,因为help_topic_id 是自增的。

原理:把要拆分的字符串拆分,首先需要知道最后要被拆分成多少个字符串,也就是上述所说的count,其次是需要知道用什么来进行拆分。所以分为两个步骤来进行sql编写

step1:获取最后需被拆分成多少个字符串,用help_topic_id 来模拟遍历第n个字符串:

help_topic_id < LENGTH('a,b,c')-LENGTH(REPLACE('a,b,c',',',''))+1

step2:根据逗号进行拆分字符串,也就是SUBSTRING_INDEX函数,最后把结果赋值给num字段

SUBSTRING_INDEX(SUBSTRING_INDEX('a,b,c',',',help_topic_id+1),',',-1) AS num

需要注意的是,这里使用的是MySQL中的内置表help_topic,里面有508条数据(不同版本数据条数有差别),用户需要有对该表查询的权限,这样的话只满足分割数量少于508条的字符串,否则应该自定义辅助表,设置更大的一个递增列

当需要分割的字符串是查询出来的时候

当需要分割的字符串是查询出来的时候,可能不止一条数据,直接嵌入模板SQL会报错

 这时候可以使用存储过程来进行处理,也就是本次遇到的问题

要求判断数值【1】是否存在于表【ec_logicplace】中的【actual_place_id】中

 首先创建一个存储过程,一个输入参数一个输出参数,输入参数为需要判断的值,输出参数为判断结果,我们以0,1来进行判断,0是输入参数不存在于表字段中,1是输入参数存在于表字段中。存储过程如下

CREATE DEFINER=`root`@`%` PROCEDURE `queryActualInLogic`(IN `actualPlaceId` bigint,OUT `isContain` int)
BEGIN
	DECLARE v_column VARCHAR(100);
	-- 设置终止标记
	declare done int default 0;
	
	# 查询出所有待判断的字段值集合
	declare table_loop cursor for 
		SELECT actual_place_id FROM ec_logicplace WHERE actual_place_id IS NOT NULL;
	# 捕获系统抛出的 not found 错误,如果捕获到,将 done 设置为 1  相当于try异常
	declare continue handler for not found set done=1;
	
	open table_loop;
	out_loop:LOOP
		# 遍历字段值,一一赋值
		FETCH NEXT FROM table_loop into v_column;
		IF done = 1 THEN
		    LEAVE out_loop;
		END IF;
		
		# 遍历字段值,拆分后进行判断,存在则赋值1,不存在则赋值0
		SET @STMT = CONCAT("SELECT COALESCE(count(1),0) AS isContain into @v_count FROM 
			(SELECT SUBSTRING_INDEX( SUBSTRING_INDEX( '",v_column,"' , ',', help_topic_id + 1 ), ',', -1 ) AS num 
				FROM mysql.help_topic WHERE
				help_topic_id < LENGTH( '",v_column,"' ) - LENGTH ( REPLACE ( '",v_column,"' , ',', '' ) ) + 1 
			) t WHERE t.num = ",actualPlaceId,";");
		PREPARE STMT FROM @STMT;
		#执行语句
		EXECUTE STMT;
		deallocate prepare STMT;
		
		set isContain = @v_count;
		if isContain = 1 THEN
			LEAVE out_loop;
		END IF;
		
	END LOOP out_loop;
	close table_loop;
END

测试:

后续MyBatis调用存储过程的返回值进行业务判断见

MyBatis调用MySQL存储过程,有返回参数 

到此这篇关于MySQL查询字段实现字符串分割split功能的示例代码的文章就介绍到这了,更多相关MySQL字符串分割内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Hadoop2.8.1完全分布式环境搭建过程

    Hadoop2.8.1完全分布式环境搭建过程

    本文搭建了一个由三节点(master、slave1、slave2)构成的Hadoop完全分布式集群(区别单节点伪分布式集群),并通过Hadoop分布式计算的一个示例测试集群的正确性。对hadoop分布式环境搭建过程感兴趣的朋友跟随小编一起看看吧
    2019-06-06
  • 如何在yml配置文件中使用中文注解

    如何在yml配置文件中使用中文注解

    这篇文章主要介绍了如何在yml配置文件中使用中文注解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java集合系列之LinkedHashMap源码分析

    Java集合系列之LinkedHashMap源码分析

    这篇文章主要为大家详细介绍了Java集合系列之LinkedHashMap源码分析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java AWT中常用的三种布局管理器详解

    Java AWT中常用的三种布局管理器详解

    这篇文章主要介绍了Java AWT中常用的三种布局管理器详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Ehcache简介_动力节点Java学院整理

    Ehcache简介_动力节点Java学院整理

    这篇文章主要介绍了Ehcache简介,使用Spring的AOP进行整合,可以灵活的对方法的返回结果对象进行缓存
    2017-07-07
  • Java中的15种锁

    Java中的15种锁

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章小编将向大家介绍是各种锁的分类,感兴趣的小伙伴可以参考下面文章的具体内容
    2021-09-09
  • 一场由Java中Integer引发的踩坑实战

    一场由Java中Integer引发的踩坑实战

    Java中的数据类型分为基本数据类型和复杂数据类型int是前者而integer是后者(也就是一个类),下面这篇文章主要给大家介绍了关于由Java中Integer引发的踩坑实战,需要的朋友可以参考下
    2022-11-11
  • 浅析Java中StringBuffer和StringBuilder的使用

    浅析Java中StringBuffer和StringBuilder的使用

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。本文就来和大家简单聊聊这二者的使用与区别吧,希望对大家有所帮助
    2023-04-04
  • IDEA如何实现批量修改变量名

    IDEA如何实现批量修改变量名

    这篇文章主要介绍了IDEA如何实现批量修改变量名问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • springboot整合easy-es实现数据的增删改查的示例代码

    springboot整合easy-es实现数据的增删改查的示例代码

    Easy-Es是一款基于ElasticSearch官方提供的RestHighLevelClient打造的低码开发框架,本文主要介绍了springboot整合easy-es实现数据的增删改查的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论