一、find_in_set()
我们知道mysql提供了一个好用的函数
FIND_IN_SET(str,strlist),
该函数的作用是查询字段(strlist)中是否包含(str)的结果,
返回结果为null或记录 。
str 要查询的字符串
strlist 需查询的字段,参数以”,”分隔,例如如 ‘1,2,3’。
下面有一组示例
1 2 3 4 5 6 7 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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
附FIND_IN_SET()和IN、LIKE的区别:
1.IN和FIND_IN_SET的区别:
1 2 | SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept WHERE '101' IN ( '101,102' ) ; |
in后面只能跟常量, 如果跟字符串的话,就会和字符串的值进行完全匹配,所以上面的sql查询不到记录。
但是find_in_set()函数可以使用常量或字段。
2.like和FIND_IN_SET的区别:
1 2 | SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept WHERE ancestors LIKE '%10%' ; |
1 2 | SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept WHERE FIND_IN_SET(10, ancestors) ; |
like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值会以英文”,”分隔,
Find_IN_SET查询的结果要小于like查询的结果。
总结
到此这篇关于mysql中find_in_set()函数用法及自定义增强函数详解的文章就介绍到这了,更多相关mysql find_in_set()函数用法内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!