目录
- 一、find_in_set()
- 二、FIND_PART_IN_SET
- 三、FIND_ALL_PART_IN_SET
一、find_in_set()
我们知道mysql提供了一个好用的函数
FIND_IN_SET(str,strlist),
该函数的作用是查询字段(strlist)中是否包含(str)的结果,
返回结果为null或记录 。
str 要查询的字符串
strlist 需查询的字段,参数以”,”分隔,例如如 '1,2,3'。
下面有一组示例
select FIND_IN_SET('1', '1,2,3');
// 结果:1
select FIND_IN_SET('3', '1,2,3');
// 结果:3
select FIND_IN_SET('4', '1,2,3');
// 结果:0
// 后一个包含前一个返回大于0的元素所在位置,不包含前一个则返回0
我们一般在查询的where条件使用 FIND_IN_SET(str,strlist)>0,则说明strlist包含str
但是这个函数的第一个参数只能判断是单个字符串,如果我有以下需求
1. 判断字符串 '1,3' 中的元素是否有任意一个元素存在字符串 '1,3,4,5,7',意思就是1或者3只要有任意一个存在字符串 '1,3,4,5,7' 中就算匹配成功。
2. 再比如判断字符串 '1,3,5' 中的所有元素是否都存在于字符串 '1,3,4,5,7' 中,即1,3,5每个元素都要在 字符串 '1,3,4,5,7'中能找到才算匹配成功。
针对需求1,提供了一个叫 FIND_PART_IN_SET 的函数
针对需求2,提供了一个叫 FIND_ALL_PART_IN_SET 的函数
二、FIND_PART_IN_SET
CREATE FUNCTION `FIND_PART_IN_SET`(str1 text, str2 text)
RETURNS text
BEGIN
#传入两个逗号分割的字符串,判断第二个字符串是否包含第一个字符串split之后的单个
DECLARE CURRENTINDEX INT;#当前下标
DECLARE CURRENTSTR text;
DECLARE result int;
set result = 0;
set CURRENTINDEX = 0;
set CURRENTSTR = '';
IF str1 IS NOT NULL AND str1 != '' THEN
SET CURRENTINDEX = LOCATE(',', str1);
WHILE CURRENTINDEX > 0
DO
SET CURRENTSTR = substring(str1, 1, CURRENTINDEX - 1);
if FIND_IN_SET(CURRENTSTR, str2)>0 THEN
set result = 1;
end if;
SET str1 = substring(str1, CURRENTINDEX + 1);
SET CURRENTINDEX = LOCATE(',', str1);
END WHILE;
#只传一个 和 最后无逗号的情况
IF LENGTH(str1) > 0 THEN
if FIND_IN_SET(str1, str2)>0 THEN
set result = 1;
end if;
END IF;
END IF;
RETURN result;
END;
实际调用判断FIND_PART_IN_SET(str1 ,str2)>0即可,例如FIND_PART_IN_SET('1,3' , '1,3,4,5')>0
三、FIND_ALL_PART_IN_SET
CREATE FUNCTION `FIND_ALL_PART_IN_SET`(str1 text, str2 text)
RETURNS text
BEGIN
#传入两个逗号分割的字符串,判断第二个字符串是否全部包含第一个字符串split之后的单个
DECLARE CURRENTINDEX INT;#当前下标
DECLARE CURRENTSTR text;
DECLARE RESULT int;
DECLARE TOTALCOUNT int;
DECLARE TRUECOUNT int;
set RESULT = 0;
set CURRENTINDEX = 0;
set CURRENTSTR = '';
set TOTALCOUNT = 0;
set TRUECOUNT = 0;
IF str1 IS NOT NULL AND str1 != '' THEN
SET CURRENTINDEX = LOCATE(',', str1);
WHILE CURRENTINDEX > 0
DO
SET TOTALCOUNT = TOTALCOUNT + 1;
SET CURRENTSTR = substring(str1, 1, CURRENTINDEX - 1);
if FIND_IN_SET(CURRENTSTR, str2)>0 THEN
SET TRUECOUNT = TRUECOUNT + 1;
end if;
SET str1 = substring(str1, CURRENTINDEX + 1);
SET CURRENTINDEX = LOCATE(',', str1);
END WHILE;
#只传一个 和 最后无逗号的情况
IF LENGTH(str1) > 0 THEN
SET TOTALCOUNT = TOTALCOUNT + 1;
if FIND_IN_SET(str1, str2)>0 THEN
SET TRUECOUNT = TRUECOUNT + 1;
end if;
END IF;
END IF;
IF TOTALCOUNT > 0 AND TRUECOUNT = TOTALCOUNT THEN
SET RESULT = 1;
END IF;
RETURN result;
END;
实际调用判断FIND_ALL_PART_IN_SET(str1 ,str2)>0即可,例如FIND_PART_IN_SET('1,3,5' , '1,3,4,5,7')>0
到此这篇关于mysql中find_in_set()函数用法及自定义增强函数的文章就介绍到这了,更多相关mysql find_in_set()内容请搜索编程客栈(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Java 的 enum 有哪些需要注意的事项?(java的enum的注意事项)
- 深入解析:如何有效提升PHP数据类型的转换效率
- 如何在 Java 中实现轮询?(java如何实现轮询)
- 如何在 Java 中获取当前时间戳?(java怎么获取当前时间戳)
- 如何简化 Java 的 DAO 层开发流程?(Java的DAO层怎样简化开发流程)
- 深入解析PHP中数据类型的转换技巧
- 在处理速度方面,C++与 Java 究竟谁更快?(c++与java处理速度哪个更快)
- Java Zuul 如何在认证授权中进行应用?(java zuul在认证授权中的应用)
- Uncomtrade数据库免费版本查询指南
- Java Lombok 使用为何不生效及解决办法(java lombok使用不生效怎么解决)