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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql installer community 5.7.16安裝詳細教程
這篇文章主要為大家介紹了mysql installer community 5.7.16安裝詳細教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
SQL Server 出現(xiàn)Error: 1326錯誤(管理器無法連接遠程數(shù)據(jù)庫)問題解決方案
這篇文章主要介紹了SQL Server 出現(xiàn)Error: 1326錯誤(管理器無法連接遠程數(shù)據(jù)庫)問題解決方案的相關(guān)資料,這里對1326 錯誤進行了詳細介紹及解決辦法,需要的朋友可以參考下2016-11-11
MySQL普通表轉(zhuǎn)換為分區(qū)表實戰(zhàn)指南
本文將詳細指導(dǎo)新手開發(fā)者如何將MySQL中的普通表轉(zhuǎn)換為分區(qū)表,分區(qū)表在處理龐大數(shù)據(jù)集時展現(xiàn)出顯著的性能優(yōu)勢,不僅能大幅提升查詢速度,還能有效簡化數(shù)據(jù)維護工作,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下2024-06-06
mysql數(shù)據(jù)類型和字段屬性原理與用法詳解
這篇文章主要介紹了mysql數(shù)據(jù)類型和字段屬性,結(jié)合實例形式分析了mysql數(shù)據(jù)類型和字段屬性基本概念、原理、分類、用法及操作注意事項,需要的朋友可以參考下2020-04-04
mysql-canal-rabbitmq 安裝部署超詳細教程
這篇文章主要介紹了mysql-canal-rabbitmq 安裝部署超詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
詳解oracle mysql 中的“不等于“ <> != ^=&nbs
oracle中的 != 與 <> 和 ^= 都是不等于,邏輯上沒有區(qū)別而mysql中,<> 和 != 相同,接下來通過本文給大家詳細講解oracle mysql 中的“不等于“ <> != ^= is not,感興趣的朋友一起看看吧2023-04-04
DBeaver連接MySQL提示"Public Key Retrieval is
dbeaver數(shù)據(jù)庫連接工具,可以支持幾乎所有的主流數(shù)據(jù)庫.mysql,oracle.sqlserver,db2 等等,這篇文章主要給大家介紹了關(guān)于DBeaver連接MySQL提示"Public Key Retrieval is not allowed"問題的解決方式,需要的朋友可以參考下2023-10-10
SQLServer 2005 自動備份數(shù)據(jù)庫的方法分享(附圖解教程)
SQLServer 2005 自動備份數(shù)據(jù)庫的方法分享(附圖解教程),使用sqlserver2005的朋友可以參考下。2011-09-09

