小工具知识网

当前位置: 首页 > 行业知识 > mysql中find

行业知识

mysql中find

2026-11-12 18:38:26 来源:互联网转载

一、find_in_set()

我们知道mysqlindex.php/tags-331.html" >提供了一个好用的函数

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 textBEGIN    #传入两个逗号分割的字符串,判断第二个字符串是否包含第一个字符串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 textBEGIN    #传入两个逗号分割的字符串,判断第二个字符串是否全部包含第一个字符串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 

上一篇:方舟怎么租赁服务器?

下一篇:服务器放哪里?