mysql判断两个字符串(以逗号分隔)是否存在交集

  • Post author:
  • Post category:mysql


转载:https://blog.csdn.net/username666/article/details/107815331?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-6.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-6.not_use_machine_learn_pai

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

成就人