zoukankan      html  css  js  c++  java
  • 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
    成就人
  • 相关阅读:
    2015/12/26 十六、 八 、二 进制转十进制
    2015/12/25 ① 图灵测试 ② 安装jdk出现的问题 ③ 配置环境变量
    java如何产生随机数
    二分查找法
    冒泡排序法
    计算阶乘
    九九乘法小练习
    数组循环语句练习
    经典循环例题练习
    如何用循环语句输出一个三角形
  • 原文地址:https://www.cnblogs.com/pingzizhuanshu/p/14252205.html
Copyright © 2011-2022 走看看