最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • mysql中find_in_set()函数用法及自定义增强函数

    一、find_in_set()

    我们知道Mysql提供了一个好用的函数

    FIND_IN_SET(str,strlist),

    该函数的作用是查询字段(strlist)中是否包含(str)的结果,
    返回结果为null或记录 。

    str 要查询的字符串
    strlist 需查询的字段,参数以”,”分隔,例如如 ‘1,2,3’。

    下面有一组示例

    select FIND_IN_SET('1', '1,2,3');
    // 结果:1
    select FIND_IN_SET('3', '1,2,3');
    // 结果:3
    select FIND_IN_SET('4', '1,2,3');
    // 结果:0
    // 后一个包含前一个返回大于0的元素所在位置,不包含前一个则返回0

    我们一般在查询的where条件使用 FIND_IN_SET(str,strlist)>0,则说明strlist包含str

    但是这个函数的第一个参数只能判断是单个字符串,如果我有以下需求

    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  的函数

    针对需求2,提供了一个叫 FIND_ALL_PART_IN_SET 的函数

    二、FIND_PART_IN_SET

    CREATE FUNCTioN `FIND_PART_IN_SET`(str1 text, str2 text)
        RETURNS text
    BEGIN
        #传入两个逗号分割的字符串,判断第二个字符串是否包含第一个字符串split之后的单个
        DECLARE CURRENTINDEX INT;#当前下标
        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;

    实际调用判断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;#当前下标
        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;

    实际调用判断FIND_ALL_PART_IN_SET(str1 ,str2)>0即可,例如FIND_PART_IN_SET(‘1,3,5’ , ‘1,3,4,5,7’)>0 

    到此这篇关于mysql中find_in_set()函数用法及自定义增强函数的文章就介绍到这了,更多相关mysql find_in_set()内容请搜索编程网(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)!

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » mysql中find_in_set()函数用法及自定义增强函数
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情