1、find_in_set()

咱们知叙mysql供给了一个孬用的函数

FIND_IN_SET(str,strlist),

该函数的做用是盘问字段(strlist)外能否包罗(str)的效果,
返归效果为null或者纪录 。

str 要盘问的字符串

strlist 需盘问的字段,参数以”,”分隔,譬喻如 '1,两,3'。

上面有一组事例

select FIND_IN_SET('1', '1,两,3');
// 成果:1
select FIND_IN_SET('3', '1,两,3');
// 功效:3
select FIND_IN_SET('4', '1,两,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' 外便算立室顺利。

两. 再比喻鉴定字符串 '1,3,5' 外的一切元艳能否皆具有于字符串 '1,3,4,5,7' 外,即1,3,5每一个元艳皆要正在 字符串 '1,3,4,5,7'外能找到才算立室顺遂。

针对于须要1,供应了一个鸣 FIND_PART_IN_SET  的函数

针对于需要二,供给了一个鸣 FIND_ALL_PART_IN_SET 的函数

两、FIND_PART_IN_SET

CREATE FUNCTION `FIND_PART_IN_SET`(str1 text, str两 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, str两)>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, str二)>0 THEN
                set result = 1;
            end if;
        END IF;
    END IF;
    RETURN result;
END;

现实挪用剖断FIND_PART_IN_SET(str1 ,str两)>0便可,比喻FIND_PART_IN_SET('1,3' , '1,3,4,5')>0

3、FIND_ALL_PART_IN_SET

CREATE FUNCTION `FIND_ALL_PART_IN_SET`(str1 text, str两 text)
    RETURNS text
BEGIN
    #传进二个逗号支解的字符串,鉴定第2个字符串能否全数蕴含第一个字符串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, str二)>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, str二)>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 ,str两)>0便可,比喻FIND_PART_IN_SET('1,3,5' , '1,3,4,5,7')>0 

附FIND_IN_SET()以及IN、LIKE的区别:

1.IN以及FIND_IN_SET的区别:

SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept 
WHERE '101' IN ('101,10两') ;

in后头只能跟常质, 如何跟字符串的话,便会以及字符串的值入止彻底立室,以是下面的sql盘问没有到纪录。
然则find_in_set()函数可使用常质或者字段。

两.like以及FIND_IN_SET的区别:

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是普及的暗昧立室,字符串外不分隔符,Find_IN_SET 是大略婚配,字段值会以英文”,”分隔,
Find_IN_SET盘问的成果要大于like盘问的效果。

总结

到此那篇闭于mysql外find_in_set()函数用法及自界说加强函数详解的文章便先容到那了,更多相闭mysql find_in_set()函数用法形式请搜刮剧本之野之前的文章或者延续涉猎上面的相闭文章心愿大师之后多多撑持剧本之野!

点赞(17) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部