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

作者:唯空城 时间:2024-01-22 03:18:55 

问题背景

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

场景模拟

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

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

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

方法实现

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

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

 通用模板为:

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 个分隔符之后的所有字符。

举例:

获取第二个以&ldquo;,&rdquo;逗号为分隔符之前的所有字符

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

获取倒数第二个以&ldquo;,&rdquo;逗号为分隔符之前的所有字符

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

LENGTH

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

LENGTH(str)

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

举例:

获取&rsquo;a,b,c&lsquo;字符串的长度

LENGTH('a,b,c')

REPLACE

替换函数,格式为:

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

举例:

将分隔符&ldquo;,&rdquo;逗号替换成&ldquo;、&rdquo;顿号

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会报错

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

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

要求判断数值【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

测试:

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

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

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

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

来源:https://blog.csdn.net/qq_37634156/article/details/122429089

标签:MySQL,字符串分割
0
投稿

猜你喜欢

  • matplotlib subplot绘制多个子图的方法示例

    2021-12-18 14:49:50
  • Python实现数据可视化案例分析

    2022-09-07 17:58:38
  • 简单介绍Python中的try和finally和with方法

    2021-01-15 07:09:49
  • java如何用正则表达式匹配与提取字符串

    2023-03-13 07:47:13
  • python识别验证码图片实例详解

    2022-02-13 10:23:53
  • 牛刀小试YUI compressor(YUI安装方法)

    2009-02-12 16:18:00
  • Python如何读写二进制数组数据

    2022-01-12 19:35:57
  • 详解JavaScript Promise和Async/Await

    2024-05-10 14:00:39
  • Python 类的私有属性和私有方法实例分析

    2021-06-18 05:13:47
  • 教你轻松学会SQL Server记录轮班的技巧

    2009-02-19 17:38:00
  • Python数据分析之双色球基于线性回归算法预测下期中奖结果示例

    2021-12-04 12:39:55
  • WEB2.0网页制作标准教程(3)定义语言编码

    2007-11-13 13:23:00
  • Python爬虫运用正则表达式的方法和优缺点

    2023-04-03 22:09:21
  • python SMTP实现发送带附件电子邮件

    2023-09-29 11:31:54
  • mysql中的utf8与utf8mb4存储及区别

    2024-01-16 15:48:09
  • Go语言实现超时的三种方法实例

    2023-06-22 18:32:43
  • 关于爬虫和反爬虫的简略方案分享

    2022-08-01 09:54:53
  • 交互设计模式(二)-Pagination(分页,标记页数)

    2009-08-03 13:37:00
  • MySQL忘记root密码错误号码1045的解决办法

    2024-01-20 17:00:43
  • Sub-Pixel Bug?!

    2010-03-24 18:09:00
  • asp之家 网络编程 m.aspxhome.com