柚子快報激活碼778899分享:數(shù)據(jù)庫 mysql中find
柚子快報激活碼778899分享:數(shù)據(jù)庫 mysql中find
一、find_in_set()
我們知道m(xù)ysql提供了一個好用的函數(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 // 后一個包含前一個返回大于0的元素所在位置,不包含前一個則返回0 ?
我們一般在查詢的where條件使用?FIND_IN_SET(str,strlist)>0,則說明strlist包含str
但是這個函數(shù)的第一個參數(shù)只能判斷是單個字符串,如果我有以下需求
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??的函數(shù)
針對需求2,提供了一個叫 FIND_ALL_PART_IN_SET 的函數(shù)
二、FIND_PART_IN_SET
CREATE FUNCTION `FIND_PART_IN_SET`(str1 text, str2 text)
RETURNS text
BEGIN
#傳入兩個逗號分割的字符串,判斷第二個字符串是否包含第一個字符串split之后的單個
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;
#只傳一個 和 最后無逗號的情況
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;
實際調(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
#傳入兩個逗號分割的字符串,判斷第二個字符串是否全部包含第一個字符串split之后的單個
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;
#只傳一個 和 最后無逗號的情況
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;
實際調(diào)用判斷FIND_ALL_PART_IN_SET(str1 ,str2)>0即可,例如FIND_PART_IN_SET('1,3,5' , '1,3,4,5,7')>0?
柚子快報激活碼778899分享:數(shù)據(jù)庫 mysql中find
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。