Mysql比较2个以逗号分隔字符串
需求:2个以逗号分隔的字符串,如有交集,则返回1,否则返回0。
示例:
1.a,b和b,c相比较,有交集b,则返回1
2.a,b和 b相比较,有交集b,则返回1
3.a,b和c相比较,没有交集,则返回0
结果:
查询SQL:select id, col1,col2, compare_str(col1, col2) as 比较结果 from t_test;

如果是通过Java获取交集可以通过遍历方式、steam、retainAll等方法。
那不想通过程序,直接通过sql的方式,那只能通过一个函数来解决。思路也是遍历。
mysql中有2个内置函数,SUBSTRING_INDEX获取逗号分隔的某一个元素,FIND_IN_SET在一个集合中检查是否存在该字符串。通过2个内置函数的组合使用,就可以遍历2个字符串。
先通过SUBSTRING_INDEX获取逗号分隔后集合的第一个元素, 然后再获取第二个元素,以此类推,两两比较即可。
创建自定义比较函数compare_str代码:
CREATE DEFINER=`user`@`%` FUNCTION `compare_str`(`col1` varchar(1024),`col2` varchar(1024)) RETURNS int(1)
BEGIN
/**
逗号分隔的字符串比较,如果有命中则返回,类似于取交集,比如a,b,c和a,b,d相比较,交集a,b。则返回1
**/
if col1 = col2 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(col1,',', 1), col2) = 1 then
/* 获取第一个*/
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col1,',', 2),',', -1), col2) = 1 then
/* 获取第二个元素*/
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col1,',', 3),',', -1), col2) = 1 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col1,',', 4),',', -1), col2) = 1 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col1,',', 5),',', -1), col2) = 1 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(col2,',', 1), col1) = 1 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col2,',', 2),',', -1), col1) = 1 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col2,',', 3),',', -1), col1) = 1 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col2,',', 4),',', -1), col1) = 1 then
return 1;
elseif FIND_IN_SET(SUBSTRING_INDEX(SUBSTRING_INDEX(col2,',', 5),',', -1), col1) = 1 then
return 1;
else
return 0;
end if;
END
相关推荐
-
MySQL 安装失败,提示Apply Security Settings 的处理办法
MySQL 安装失败,提示Apply Security Settings 的处理办法2025-04-20 01:54:57 -
MySQL事务隔离级别详解2025-04-20 01:44:01
-
一文说清nginx规则匹配(含案例分析)2025-04-20 01:10:02
-
运维服务篇:Nginx常用功能(rewrite重定向/location定位等)
运维服务篇:Nginx常用功能(rewrite重定向/location定位等)2025-04-20 00:55:25 -
php定义变量规则不能包含哪些字符?2025-04-20 00:27:24