概述
最近有需要用到求两个字符串是否有交集(原本想要求相似度的,暂时无法实现,只好转为判断是否存在交集的替代方案)方法,暂时找到以下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判断两个字符串(以逗号分隔)是否存在交集所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复