mysql中find_in_set()函数用法及自定义增强函数

 更新时间:2024年08月13日 11:51:56   作者:@步行者@  
MySQL 中的 FIND_IN_SET 函数用于在逗号分隔的字符串列表中查找指定字符串的位置,本文就来介绍一下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()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mysql错误Cannot find or open table x/x from the internal问题解决方法

    Mysql错误Cannot find or open table x/x from the internal问题解决方法

    这篇文章主要介绍了Mysql错误Cannot find or open table x/x from the internal问题解决方法,需要的朋友可以参考下
    2014-06-06
  • Mac OS下PHP环境搭建及PHP操作MySQL常用方法小结

    Mac OS下PHP环境搭建及PHP操作MySQL常用方法小结

    MAMP从名字上也可以看出来,是Mac OS的Apache+MySQL+PHP的集成环境包,本文就来简单说一下Mac OS下PHP环境搭建及PHP操作MySQL的常用方法小结.
    2016-05-05
  • MySQL JSON查询与索引详解

    MySQL JSON查询与索引详解

    本文给大家介绍了MySQL JSON查询与索引的相关知识,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-11-11
  • MySQL Daemon failed to start错误解决办法

    MySQL Daemon failed to start错误解决办法

    这篇文章主要介绍了MySQL Daemon failed to start错误解决办法的相关资料,需要的朋友可以参考下
    2017-01-01
  • count(1)、count(*)与count(列名)的执行区别详解

    count(1)、count(*)与count(列名)的执行区别详解

    这篇文章主要介绍了count(1)、count(*)与count(列名)的执行区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Oracle开启和关闭的四种模式

    Oracle开启和关闭的四种模式

    这篇文章主要介绍了Oracle开启和关闭的四种模式 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • MySQL之存储过程按月创建表的方法步骤

    MySQL之存储过程按月创建表的方法步骤

    这篇文章主要介绍了MySQL之存储过程按月创建表的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • PHP访问MySQL查询超时处理的方法

    PHP访问MySQL查询超时处理的方法

    PHP连接MySQL主要是使用Mysql提供的 libmysqlclient 的客户端库,同时也延伸出来 mysql 和 mysqli 两套PHP的扩展,相对来说 mysqli 比 mysql 更好,更稳定。
    2011-05-05
  • Windows服务器MySQL中文乱码的解决方法

    Windows服务器MySQL中文乱码的解决方法

    这篇文章主要介绍了MySQL中文乱码的一些解决方案,本文同时分解了MySQL中文乱码的原因分析,需要的朋友可以参考下
    2015-01-01
  • MySQL无法输入中文字符问题的解决办法

    MySQL无法输入中文字符问题的解决办法

    MySQL无法输入中文的问题大多是由于字符集不匹配所导致的,下面这篇文章主要给大家介绍了关于MySQL无法输入中文字符问题的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05

最新评论