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