MySQL查询字段实现字符串分割split功能的⽰例代码⽬录
问题背景
场景模拟
⽅法实现
SUBSTRING_INDEX
LENGTH
REPLACE
SQL解析
问题背景
查询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调⽤存储过程的返回值进⾏业务判断见
到此这篇关于MySQL查询字段实现字符串分割split功能的⽰例代码的⽂章就介绍到这了,更多相关MySQL字符串分割内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论