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

 更新时间:2024年06月22日 10:54:42   作者:熊出没  
这篇文章主要给大家介绍了关于mysql中find_in_set()函数用法及自定义增强函数的相关资料,在MySQL 数据库中进行复杂的查询语句,例如对多个字段进行筛选和排序,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、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 

附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,102') ;

in后面只能跟常量, 如果跟字符串的话,就会和字符串的值进行完全匹配,所以上面的sql查询不到记录。
但是find_in_set()函数可以使用常量或字段。

2.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()函数用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中联合主键的操作方式

    MySQL中联合主键的操作方式

    MySQL联合主键操作包括创建、新增和修改,创建时在表定义中使用PRIMARY KEY关键字指定多个字段,新增和修改时,分别使用ALTER TABLE语句删除旧主键并添加新主键
    2024-12-12
  • MySQL中锁的相关问题

    MySQL中锁的相关问题

    这篇文章主要介绍了MySQL中锁的相关问题,本文给大家介绍了从对数据操作的粒度分 ,从对数据操作的类型分,给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • MySQL打印死锁日志的方法步骤

    MySQL打印死锁日志的方法步骤

    本文主要介绍了MySQL打印死锁日志的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 如何保护MySQL中重要数据的方法

    如何保护MySQL中重要数据的方法

    在日常的工作中,保护数据免受未授权用户的侵犯是系统管理员特别关心的问题。如果你目前用的是MySQL,就可以使用一些方便的功能来保护系统,来大大减少机密数据被未授权用户访问的风险
    2011-10-10
  • win32安装配置非安装版的MySQL

    win32安装配置非安装版的MySQL

    当前非安装版是从MySQL.com下载来的v5.1.40;下载下来的是一个ZIP压缩包,解压到C:\MySQL5.1.40目录,接下来,设置系统环境变量,好在CMD命令行下使用MySQL。
    2010-02-02
  • MYSQL复杂查询练习题以及答案大全(难度适中)

    MYSQL复杂查询练习题以及答案大全(难度适中)

    在我们学习mysql数据库时需要一些题目进行练习,下面这篇文章主要给大家介绍了关于MYSQL复杂查询练习题以及答案的相关资料,文中通过实例代码介绍的非常详细,这些练习题难度适中,需要的朋友可以参考下
    2022-08-08
  • MySQL之PXC集群搭建的方法步骤

    MySQL之PXC集群搭建的方法步骤

    PXC 是一套 MySQL 高可用集群解决方案,本文主要介绍了MySQL之PXC集群搭建的方法步骤,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • MySQL存储过程的传参和流程控制示例讲解

    MySQL存储过程的传参和流程控制示例讲解

    这篇文章主要介绍了MySQL存储过程的传参和流程控制示例讲解, repeat和Loop区别是repeat有自己退出循环的语句until,Loop使用的是if判断语句,本文结合示例代码详细讲解,需要的朋友可以参考下
    2023-02-02
  • MySql两表关联更新update示例SQL语句(用一个表更新另一个表)

    MySql两表关联更新update示例SQL语句(用一个表更新另一个表)

    这篇文章主要介绍了MySql两表关联更新update示例SQL语句的相关资料,文中分享了两种处理方式(保留/清空未匹配数据),演示触发器记录更新操作至audit表,并通过示例SQL展示不同场景下更新效果及注意事项,需要的朋友可以参考下
    2025-06-06
  • MySQL DNS的使用过程详细分析

    MySQL DNS的使用过程详细分析

    当 mysql 客户端连接 mysql 服务器 (进程为:mysqld),mysqld 会创建一个新的线程来处理该请求。该线程先检查是否主机名在主机名缓存中
    2012-11-11

最新评论