最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中find_in_set()函數(shù)用法及自定義增強函數(shù)詳解

 更新時間:2024年06月22日 10:54:42   作者:熊出沒  
這篇文章主要給大家介紹了關(guān)于mysql中find_in_set()函數(shù)用法及自定義增強函數(shù)的相關(guān)資料,在MySQL 數(shù)據(jù)庫中進行復(fù)雜的查詢語句,例如對多個字段進行篩選和排序,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、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)文章

最新評論

河东区| 当阳市| 台北市| 太仆寺旗| 图片| 红桥区| 茶陵县| 陆河县| 鄂尔多斯市| 三明市| 焉耆| 巴里| 龙海市| 布尔津县| 高陵县| 曲周县| 锡林郭勒盟| 云霄县| 德清县| 舟曲县| 开江县| 长汀县| 台东市| 滨海县| 武隆县| 东兴市| 江达县| 来安县| 菏泽市| 黑河市| 邢台市| 绵竹市| 安仁县| 茌平县| 东方市| 三明市| 秦安县| 莒南县| 丘北县| 库伦旗| 文成县|