我是靠谱客的博主 单薄小虾米,最近开发中收集的这篇文章主要介绍mysql判断两个字符串(以逗号分隔)是否存在交集,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近有需要用到求两个字符串是否有交集(原本想要求相似度的,暂时无法实现,只好转为判断是否存在交集的替代方案)方法,暂时找到以下2个方法。

方法一:正则

select concat(str1, ',') regexp concat(replace(str2,',',',|'),',');

示例:

select '123|456|125' regexp '123|126'; -- 1
select '123' regexp '123|456'; -- 1
select concat('123,456', ',') regexp concat(replace('456,789',',',',|'),','); -- 1
select concat('123,456', ',') regexp concat(replace('456,',',',',|'),','); -- 1
select concat('电子信息,科技', ',') regexp concat(replace('软件工程,电子信息,概率统计',',',',|'),','); -- 1
select concat(',', ',') regexp concat(replace('软件工程,电子信息,概率统计',',',',|'),','); -- 0

方法二:

DROP FUNCTION IF EXISTS  `INTE_ARRAY`;  
-- 集合交集检查函数  
-- @param varchar(255) setA A 集合 如 "1,3,5,9"  
-- @param varchar(255) setB B 集合 如 "8,2,3,7"  
-- @return int(1) B 集合内单元在 A集合 内存在则返回 1 否则返回 0  
CREATE DEFINER=`root`@`localhost` FUNCTION `INTE_ARRAY` (setA varchar(255),setB varchar(255)) RETURNS int(1)
    DETERMINISTIC
BEGIN  
    DECLARE idx INT DEFAULT 0 ; -- B 集合单元索引   
    DECLARE len INT DEFAULT 0;-- B 集合表达式长度  
    DECLARE llen INT DEFAULT 0;-- 最后检查位置  
    DECLARE clen INT DEFAULT 0;-- 当前检查位置  
    DECLARE tmpStr varchar(255);-- 临时检查数据集  
    DECLARE curt varchar(255);-- B 当前检查的单元  
    SET len = LENGTH(setB);  
    WHILE idx < len DO  
        SET idx = idx + 1;  
        SET tmpStr = SUBSTRING_INDEX(setB,",",idx);  
        SET clen = LENGTH(tmpStr);  
-- 获取当前 setB 中的单元  
        IF idx = 1 THEN SET curt = tmpStr;  
        ELSE SET curt = SUBSTRING(setB,llen+2,clen-llen-1);  
        END IF;  
-- 检查是否存在于 setA 中  
        IF curt != '' and FIND_IN_SET(curt,setA) > 0 THEN RETURN 1;  
        END IF;  
-- 当前检查终点与上次检查终点相同则跳出  
        IF clen <= llen THEN RETURN 0;  
        END IF;  

        SET llen = clen;  
    END WHILE;  
    RETURN 0;  
END;  

测试:

select INTE_ARRAY("1,3,5,9","8,2,3,7") as is_inte_array; -- 1
select INTE_ARRAY("电子信息,科技","电子信息科技,软件工程") as is_inte_array; -- 0
select INTE_ARRAY("电子信息,科技","电子信息") as is_inte_array; -- 1
select INTE_ARRAY("电子信息,科技","电子信息,科技") as is_inte_array; -- 1
-- 不应把单个逗号也算作交集
select INTE_ARRAY(",","电子信息,科技") as is_inte_array; -- 0

参考链接:

  • https://blog.csdn.net/qq_30607881/article/details/77098130
  • https://www.cnblogs.com/tranquillity/p/9525176.html
  • https://blog.csdn.net/lizhuquanx/article/details/84734784
  • https://www.it1352.com/337830.html
  • https://blog.csdn.net/txqd1989/article/details/89359003

最后

以上就是单薄小虾米为你收集整理的mysql判断两个字符串(以逗号分隔)是否存在交集的全部内容,希望文章能够帮你解决mysql判断两个字符串(以逗号分隔)是否存在交集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部