mysql中find_in_set()函數(shù)用法及自定義增強函數(shù)詳解
一、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
附FIND_IN_SET()和IN、LIKE的區(qū)別:
1.IN和FIND_IN_SET的區(qū)別:
SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept WHERE '101' IN ('101,102') ;
in后面只能跟常量, 如果跟字符串的話,就會和字符串的值進行完全匹配,所以上面的sql查詢不到記錄。
但是find_in_set()函數(shù)可以使用常量或字段。
2.like和FIND_IN_SET的區(qū)別:
SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept WHERE ancestors LIKE '%10%' ;
SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept WHERE FIND_IN_SET(10, ancestors) ;
like是廣泛的模糊匹配,字符串中沒有分隔符,F(xiàn)ind_IN_SET 是精確匹配,字段值會以英文”,”分隔,
Find_IN_SET查詢的結(jié)果要小于like查詢的結(jié)果。
總結(jié)
到此這篇關(guān)于mysql中find_in_set()函數(shù)用法及自定義增強函數(shù)詳解的文章就介紹到這了,更多相關(guān)mysql find_in_set()函數(shù)用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL的FIND_IN_SET函數(shù)使用方法分享
- Mysql中的find_in_set的使用方法介紹
- Mysql中FIND_IN_SET()和IN區(qū)別簡析
- mysql通過find_in_set()函數(shù)實現(xiàn)where in()順序排序
- MySQL中find_in_set()函數(shù)用法示例詳解
- MySQL之FIND_IN_SET()的用法及說明
- Mysql中find_in_set()函數(shù)用法詳解以及使用場景
- mysql查詢FIND_IN_SET?REGEXP實踐示例
- MySQL中的FIND_IN_SET函數(shù)的使用場景
- Mysql中FIND_IN_SET函數(shù)的使用及問題
- MySQL FIND_IN_SET函數(shù)的使用場景
相關(guān)文章
Mysql啟動中 InnoDB: Error: log file ./ib_logfile0 is of differe
對于使用了默認(rèn) my.cnf(一般教程都會教你使用support-files/my-medium.cnf)的Mysql服務(wù)來說如果中間使用了innodb的話,innodb默認(rèn)的log file大小是56M2011-05-05Windows平臺配置5.7版本+MySQL數(shù)據(jù)庫服務(wù)
這篇文章主要介紹了Windows平臺配置5.7版本+MySQL數(shù)據(jù)庫服務(wù)的方法,包括初始化root用戶密碼password的過程以及兩個常見問題的解決方法,需要的朋友參考下吧2017-06-06用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程
這篇文章主要介紹了用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程,可以輕松地將服務(wù)器基本信息錄入數(shù)據(jù)庫,需要的朋友可以參考下2015-11-11mysql啟動的error 2003和1067錯誤問題解決方法
mysql安裝好經(jīng)常發(fā)現(xiàn)無法正常啟動碰到最多的是error 2003的錯誤,經(jīng)研究在此附上解決方法,希望可以幫助有類似問題的朋友2013-09-09一文理解MySQL數(shù)據(jù)庫的約束與表的設(shè)計
約束是用來限制表中的數(shù)據(jù)長什么樣子的,即什么樣的數(shù)據(jù)可以插入到表中,什么樣的數(shù)據(jù)插入不到表中,下面這篇文章主要給大家介紹了關(guān)于如何通過一文理解MySQL數(shù)據(jù)庫的約束與表的設(shè)計的相關(guān)資料,需要的朋友可以參考下2022-11-11