mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)
一、find_in_set()
我們知道m(xù)ysql提供了一個(gè)好用的函數(shù)
FIND_IN_SET(str,strlist),
該函數(shù)的作用是查詢字段(strlist)中是否包含(str)的結(jié)果,
返回結(jié)果為null或記錄 。
str 要查詢的字符串
strlist 需查詢的字段,參數(shù)以”,”分隔,例如如 '1,2,3'。
下面有一組示例
select FIND_IN_SET('1', '1,2,3');
// 結(jié)果:1
select FIND_IN_SET('3', '1,2,3');
// 結(jié)果:3
select FIND_IN_SET('4', '1,2,3');
// 結(jié)果:0
// 后一個(gè)包含前一個(gè)返回大于0的元素所在位置,不包含前一個(gè)則返回0我們一般在查詢的where條件使用 FIND_IN_SET(str,strlist)>0,則說明strlist包含str
但是這個(gè)函數(shù)的第一個(gè)參數(shù)只能判斷是單個(gè)字符串,如果我有以下需求
1. 判斷字符串 '1,3' 中的元素是否有任意一個(gè)元素存在字符串 '1,3,4,5,7',意思就是1或者3只要有任意一個(gè)存在字符串 '1,3,4,5,7' 中就算匹配成功。
2. 再比如判斷字符串 '1,3,5' 中的所有元素是否都存在于字符串 '1,3,4,5,7' 中,即1,3,5每個(gè)元素都要在 字符串 '1,3,4,5,7'中能找到才算匹配成功。
針對需求1,提供了一個(gè)叫 FIND_PART_IN_SET 的函數(shù)
針對需求2,提供了一個(gè)叫 FIND_ALL_PART_IN_SET 的函數(shù)
二、FIND_PART_IN_SET
CREATE FUNCTION `FIND_PART_IN_SET`(str1 text, str2 text)
RETURNS text
BEGIN
#傳入兩個(gè)逗號分割的字符串,判斷第二個(gè)字符串是否包含第一個(gè)字符串split之后的單個(gè)
DECLARE CURRENTINDEX INT;#當(dāng)前下標(biāo)
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;
#只傳一個(gè) 和 最后無逗號的情況
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;實(shí)際調(diào)用判斷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
#傳入兩個(gè)逗號分割的字符串,判斷第二個(gè)字符串是否全部包含第一個(gè)字符串split之后的單個(gè)
DECLARE CURRENTINDEX INT;#當(dāng)前下標(biāo)
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;
#只傳一個(gè) 和 最后無逗號的情況
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;實(shí)際調(diào)用判斷FIND_ALL_PART_IN_SET(str1 ,str2)>0即可,例如FIND_PART_IN_SET('1,3,5' , '1,3,4,5,7')>0
到此這篇關(guān)于mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)的文章就介紹到這了,更多相關(guān)mysql find_in_set()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql中find_in_set()函數(shù)的使用及in()用法詳解
- mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)詳解
- Mysql中find_in_set()函數(shù)用法詳解以及使用場景
- mysql中find_in_set()函數(shù)的使用詳解
- mysql通過find_in_set()函數(shù)實(shí)現(xiàn)where in()順序排序
- MySQL中find_in_set()函數(shù)用法示例詳解
- MySQL中FIND_IN_SET()函數(shù)與in的區(qū)別及說明
- MySQL?FIND_IN_SET字符串函數(shù)深度解析
相關(guān)文章
MySQL 5.5.49 大內(nèi)存優(yōu)化配置文件優(yōu)化詳解
最近mysql服務(wù)器升級到了MySQL 5.5.49版本,性能比mysql 5.0.**肯定效率高了不少,但mysql的默認(rèn)配置文件不合理,這里是針對大內(nèi)存訪問量大的機(jī)器的配置方案,需要的朋友可以參考下2016-05-05
MySQL中列子查詢與行子查詢操作的學(xué)習(xí)教程
這篇文章主要介紹了MySQL中列子查詢與行子查詢操作的學(xué)習(xí)教程,子查詢是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-12-12
計(jì)算機(jī)二級考試MySQL知識點(diǎn) 常用MYSQL命令
這篇文章主要介紹了計(jì)算機(jī)二級考試MySQL知識點(diǎn),詳細(xì)介紹了常用MYSQL命令,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08

