欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、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'中能找到才算匹配成功。

針對(duì)需求1,提供了一個(gè)叫 FIND_PART_IN_SET  的函數(shù)

針對(duì)需求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è)逗號(hào)分割的字符串,判斷第二個(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è) 和 最后無逗號(hào)的情況
        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è)逗號(hào)分割的字符串,判斷第二個(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è) 和 最后無逗號(hào)的情況
        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 

附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后面只能跟常量, 如果跟字符串的話,就會(huì)和字符串的值進(jìn)行完全匹配,所以上面的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 是精確匹配,字段值會(huì)以英文”,”分隔,
Find_IN_SET查詢的結(jié)果要小于like查詢的結(jié)果。

總結(jié)

到此這篇關(guān)于mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)詳解的文章就介紹到這了,更多相關(guān)mysql find_in_set()函數(shù)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql啟動(dòng)中 InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes 的問題

    Mysql啟動(dòng)中 InnoDB: Error: log file ./ib_logfile0 is of differe

    對(duì)于使用了默認(rèn) my.cnf(一般教程都會(huì)教你使用support-files/my-medium.cnf)的Mysql服務(wù)來說如果中間使用了innodb的話,innodb默認(rèn)的log file大小是56M
    2011-05-05
  • Windows平臺(tái)配置5.7版本+MySQL數(shù)據(jù)庫(kù)服務(wù)

    Windows平臺(tái)配置5.7版本+MySQL數(shù)據(jù)庫(kù)服務(wù)

    這篇文章主要介紹了Windows平臺(tái)配置5.7版本+MySQL數(shù)據(jù)庫(kù)服務(wù)的方法,包括初始化root用戶密碼password的過程以及兩個(gè)常見問題的解決方法,需要的朋友參考下吧
    2017-06-06
  • MySQL如何使用limit獲取最后一條記錄

    MySQL如何使用limit獲取最后一條記錄

    這篇文章主要介紹了MySQL如何使用limit獲取最后一條記錄問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    這篇文章主要介紹了php mysql連接數(shù)據(jù)庫(kù)實(shí)例,需要的朋友可以參考下
    2016-09-09
  • 用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程

    用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程

    這篇文章主要介紹了用percona-toolkit為MySQL收集系統(tǒng)和性能信息的教程,可以輕松地將服務(wù)器基本信息錄入數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2015-11-11
  • MySQL 日期時(shí)間加減的示例代碼

    MySQL 日期時(shí)間加減的示例代碼

    本文主要介紹了MySQL日期時(shí)間加減,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MySQL億級(jí)大表安全添加字段的三種方案

    MySQL億級(jí)大表安全添加字段的三種方案

    面對(duì)?1.35億條數(shù)據(jù)?的?MySQL?表添加字段,傳統(tǒng)?ALTER?TABLE?可能導(dǎo)致長(zhǎng)時(shí)間鎖表,嚴(yán)重影響業(yè)務(wù),本文將提供一套完整的?零停機(jī)方案,涵蓋?Online?DDL?優(yōu)化、專業(yè)工具使用?和?Java?應(yīng)用層配合策略,需要的朋友可以參考下
    2025-03-03
  • mysql啟動(dòng)的error 2003和1067錯(cuò)誤問題解決方法

    mysql啟動(dòng)的error 2003和1067錯(cuò)誤問題解決方法

    mysql安裝好經(jīng)常發(fā)現(xiàn)無法正常啟動(dòng)碰到最多的是error 2003的錯(cuò)誤,經(jīng)研究在此附上解決方法,希望可以幫助有類似問題的朋友
    2013-09-09
  • MySQL分布式恢復(fù)進(jìn)階

    MySQL分布式恢復(fù)進(jìn)階

    這篇文章主要介紹了MySQL分布式恢復(fù)進(jìn)階,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-07-07
  • 一文理解MySQL數(shù)據(jù)庫(kù)的約束與表的設(shè)計(jì)

    一文理解MySQL數(shù)據(jù)庫(kù)的約束與表的設(shè)計(jì)

    約束是用來限制表中的數(shù)據(jù)長(zhǎng)什么樣子的,即什么樣的數(shù)據(jù)可以插入到表中,什么樣的數(shù)據(jù)插入不到表中,下面這篇文章主要給大家介紹了關(guān)于如何通過一文理解MySQL數(shù)據(jù)庫(kù)的約束與表的設(shè)計(jì)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評(píng)論