Mysql比较2个以逗号分隔字符串

100人浏览   2025-02-28 00:17:04


需求: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

相关推荐