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调用存储过程的返回值进行业务判断见

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

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

(0)

相关推荐

  • MySQL里实现类似SPLIT的分割字符串的函数

    下边的函数,实现了象数组一样去处理字符串. 一,用临时表作为数组 复制代码 代码如下: create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as begin while(charindex(@split,@c)<>0) begin insert @t(col) values (substring(@c,1,charindex(@split,@c)-1)) se

  • Mysql通过存储过程分割字符串为数组

    分割字符串为数组需要用到 三个mysql 的函数 : REVERSE(str) 返回颠倒字符顺序的字符串str. SUBSTRING_INDEX(str,delim,count) 返回从字符串str的第count个出现的分隔符delim之后的子串.如果count是正数,返回最后的分隔符到左边(从左边数) 的所有字符.如果count是负数,返回最后的分隔符到右边的所有字符(从右边数). REPLACE(str,from_str,to_str) 返回字符串str,其字符串from_str的所有出现由

  • 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

  • mysql查询字段类型为json时的两种查询方式

    表结构如下: id varchar(32) info json 数据: id = 1 info = {"age": "18","disname":"小明"} -------------------------------------------- 现在我需要获取info中disanme的值,查询方法有: 1. select t.id,JSON_EXTRACT(t.info,'$.disname') as disname fro

  • Mysql查询以某"字符串"开头的查询方式

    目录 Mysql查询以某"字符串"开头的查询 查询不以某个或者某些字符串为开头的字符串 查询以某个或者某些字符串为开头的字符串 Mysql查询条件字符串类型 = 0 假如有表A A表中有以下数据 Mysql查询以某"字符串"开头的查询 查询不以某个或者某些字符串为开头的字符串 1.使用left()函数 select * from order where left(id,2)<>"AB"; 2.使用like select * from

  • MySQL实现字段或字符串拼接的三种方式总结

    目录 一.CONCAT函数 1.1.拼接非空字段或字符串 1.2.拼接空(NULL)字段 二.CONCAT_WS函数 2.1.拼接非空字段或字符串 2.2.拼接空(NULL)字段 三.GROUP_CONCAT函数 3.1.默认以逗号分隔符连接 3.2.可自定义对字段去重排序和指定分隔符 3.3.group_concat的限制和设置 一.CONCAT函数 concat函数是将多个字段或字符串拼接为一个字符串:但是字符串之间没有任何分隔. concat函数官方介绍 -- CONCAT函数的语法如下:

  • MyBatis XML方式的基本用法之多表查询功能的示例代码

    1. 多表查询 在之前,我们示例的2个查询都是单表查询,但实际的业务场景肯定是需要多表查询的,比如现在有个需求: 查询某个用户拥有的所有角色.这个需求要涉及到sys_user,sys_user_role,sys_role三张表,如何实现呢? 首先,在SysUserMapper接口中定义如下方法. /** * 根据用户id获取角色信息 * * @param userId * @return */ List<SysRole> selectRolesByUserId(Long userId); 然后

  • MyBatis Plus 实现多表分页查询功能的示例代码

    在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值 一.分页配置 可以直接使用selectPage这样的分页,但返回的数据确实是分页后的数据,但在控制台打印的SQL语句其实并没有真正的物理分页,而是通过缓存来获得全部数据中再进行的分页,这样对于大数据

  • JS字符串分割方法整理汇总示例讲解(3种截取方法和6个辅助方法)

    目录 一.使用 slice() 截取 1,函数说明 2,使用样例 二.使用 substring() 截取 1.函数说明 2.使用样例 三.使用 substr() 截取 1.函数说明 2.使用样例 附:其他一些常用的方法 1.indexOf() 2,lastIndexOf() 3,split() 4,join() 5,concat() 6,charAt() JavaScript在开发中常常会需要截取字符串,而JS提供了slice() .substring().substr() 3种方法实现截取操作

  • LyScript实现指令查询功能的示例代码

    目录 搜索内存中的机器码 搜索内存反汇编代码 通过对LyScript自动化插件进行二次封装,实现从内存中读入目标进程解码后的机器码,并通过Python代码在这些机器码中寻找特定的十六进制字符数组,或直接检索是否存在连续的反汇编指令片段等功能. LyScript项目地址:https://github.com/lyshark/LyScript 搜索内存中的机器码 内存机器码需要配合LyScript32插件,从内存中寻找指令片段. from LyScript32 import MyDebug # 将可

  • vue实现禁止浏览器记住密码功能的示例代码

    查找资料 网上查到的一些方法: 使用 autocomplete="off"(现代浏览器许多都不支持) 使用 autocomplete="new-password" 在真正的账号密码框之前增加相同 name 的 input 框 使用 readonly 属性,在聚焦时移除该属性 初始化 input 框的 type 属性为 text,聚焦时修改为 password 使用 type="text",手动替换文本框内容为星号 "*" 或者

  • 利用Redis实现点赞功能的示例代码

    目录 MySQL 和 Redis优缺点 1.Redis 缓存设计及实现 部分代码如下 Redis 存储结构如图 2.数据库设计 3.开启定时任务持久化存储到数据库 部分代码如下 提到点赞,大家一想到的是不是就是朋友圈的点赞呀?其实点赞对我们来说并不陌生,我们经常会在手机软件或者网页中看到它,今天就让我们来了解一下它的实现吧.我们常见的设计思路大概分为两种:一种自然是用 MySQL 等数据库直接落地存储, 另外一种就是将点赞的数据保存到 Redis 等缓存里,在一定时间后刷回 MySQL 等数据库

随机推荐