自定义mysql函数之字符串逗号分割查询(find_in_set)

文章介绍了如何在MySQL中通过创建自定义函数find_in_set_multiple()来扩展find_in_set()的功能,使其能一次性判断多个字符串是否存在于由逗号分隔的字段值中。这种方法解决了当需要在字段中同时搜索多个值时,避免编写冗长的OR条件的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

增强 find_in_set()

在mysql中,我们有时候设计数据库某个字段需要通过逗号进行分割,然后根据传入的字符串查询是否存在的方法进行判断,mysql默认的 find_in_set() 可以对比某个逗号分割的字符串中是否存在指定字符串,例如下面的例子

create table t_test(
    id bigint auto_increment primary key comment 'id',
    name varchar(255) default null comment '名称'
) comment '测试表';

insert into t_test(name) values ('a,b'),('z,k'),('a,c');

在这里插入图片描述

例如:我需要查询,字段中有a的数据,通过 find_in_set() 就可以查询出来

select * from t_test where find_in_set('a', name);

在这里插入图片描述
假如我现在需要判断多个字符串是否都存在于字符串里面,那么就需要下面这么写了,如果字符多了,那么就会很长,所以我们对其进行增强一下,让它可以支持多个字符串

select * from t_test where find_in_set('a', name) or find_in_set('z', name);

增强函数,这样就可以实现多个字符串的查找了

DELIMITER //

CREATE FUNCTION find_in_set_multiple(str_list VARCHAR(255), search_str VARCHAR(255))
RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE pos INT DEFAULT 1;          -- 当前查找的起始位置
    DECLARE result INT DEFAULT 0;       -- 默认返回的匹配结果false
    DECLARE current_str VARCHAR(255);   -- 当前字符串
    DECLARE comma_pos INT;              -- 逗号的位置

    WHILE pos > 0 DO
        SET comma_pos = INSTR(str_list, ',');   -- 查找逗号的位置

        IF comma_pos = 0 THEN                   -- 如果没有逗号,那么字符串就是全部的字符串
            SET current_str = str_list;
            SET pos = 0;
        ELSE
            SET current_str = SUBSTRING(str_list, 1, comma_pos - 1);    -- 截取逗号之前的字符串
            SET str_list = SUBSTRING(str_list, comma_pos + 1);
        END IF;

        -- 如果当前字符串存在于搜索的字符串中,设置结果为1,结束循环
        IF FIND_IN_SET(current_str, search_str) > 0 THEN
            SET result = 1;
            SET pos = 0;
        END IF;
    END WHILE;

    RETURN result;
END //

DELIMITER ;

创建好函数之后对应的改造sql

select * from t_test where find_in_set_multiple(name, 'a,z');

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值