转载: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

mysql判断两个字符串(以逗号分隔)是否存在交集的更多相关文章

  1. mysql 判断两个字符串是否存在包含关系-------(1,2,3)与(2,3)

    1.这里这个是目前有问题的   #创建FUNCTION  DELIMITER ;     CREATE FUNCTION `is_mixed`(str1 TEXT, str2 TEXT) RETURN ...

  2. java中判断两个字符串是否相等的问题

    我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...

  3. python利用difflib判断两个字符串的相似度

    我们再工作中可能会遇到需要判断两个字符串有多少相似度的情况(比如抓取页面内容存入数据库,如果相似度大于70%则判定为同一片文章,则不录入数据库) 那这个时候,我们应该怎么判断呢? 不要着急,pytho ...

  4. Mysql判断是否某个字符串在某字符串字段的4种方法

    方法一:like SELECT * FROM 表名 WHERE 字段名 like "%字符%"; 方法二:find_in_set() 利用mysql 字符串函数 find_in_s ...

  5. ✡ leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java

    Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到 ...

  6. leetcode-242 判断两个字符串是不是 Anagram ?

    题目描述 假设给定两个字符串 s 和 t, 让我们写出一个方法来判断这两个字符串是否是字母异位词? 字母异位词就是,两个字符串中含有字母的个数和数量都一样,比如: Example 1: Input: ...

  7. [leetcode]242. Valid Anagram判断两个字符串是不是包含相同字符的重排列

    /* 思路是判断26个字符在两个字符串中出现的次数是不是都一样,如果一样就返回true. 记住这个方法 */ if (s.length()!=t.length()) return false; int ...

  8. [google面试CTCI] 1-4.判断两个字符串是否由相同字符组成

    [字符串与数组] Q:Write a method to decide if two strings are anagrams or not 题目:写一个算法来判断两个字符串是否为换位字符串.(换位字 ...

  9. mysql判断两个时间段是否有交集

    //判断两个时间段是否有交集 private function checkTimeCross($start_time,$end_time){ $sql ) AND ((start_time > ...

  10. str_1.判断两个字符串每个字符出现的次数一样

    1.两个字符串每个字符出现的次数一样 $str1 = "ab'c4*"; $str2 = "cb*'a4"; $ret = isBX($str1, $str2) ...

随机推荐

  1. 《最新出炉》系列入门篇-Python+Playwright自动化测试-44-鼠标操作-上篇

    1.简介 前边文章中已经讲解过鼠标的拖拽操作,今天宏哥在这里对其的其他操作进行一个详细地介绍和讲解,然后对其中的一些比较常见的.重要的操作单独拿出来进行详细的介绍和讲解. 2.鼠标操作语法 鼠标操作介 ...

  2. Linux中典型的文件权限问题

    总结起来说,可以打个比方,目录就像一间上了锁有窗户的屋子.如果你只想看屋子里面有啥,那么只要拥有r权限,不必进入到屋子,透过屋子的窗户就能看到里面的东西:但是如果你想改变屋子里面的物件,或者从屋子里面 ...

  3. flask3之CBV和session

    flask的CBV CBV书写案例 from flask import Flask app=Flask(__name__) #FBA @app.route("/") def ind ...

  4. tkinter小例子

    from tkinter import * def on_click(): label['text'] = text.get() root = Tk(className='hello') root.m ...

  5. 通过 InnoSetup 美化安装界面

    InnoSetup 的美化相应的帖子也比较多,但是代码不是很全...所以我专门出了这篇文章来记录下这个美化过程.废话不多说,先上个成果: 前端er们可以直接下载 vue-nw-seed 这个分支,一键 ...

  6. NOIP模拟87(多校20)

    前言 题目不难,但是个人感觉小细节有一些,然后有亿点卡常.. 感觉对于笛卡尔树的题目看不出算法,然后代码实现方面细节注意太少,常数有点大. 下次注意吧. T1 集合均值 解题思路 感觉应该是期望题里面 ...

  7. css 跑马灯

    html: <view class="in_scro"> <view class="in_scrview">恭喜139******1用户 ...

  8. Vue简单自定义Canvas验证码组件。

    在您的Vue项目中,是否曾遇到过需要增加验证码来增强账户安全性的情况?这个Vue通用Canvas验证码组件!采用Canvas,实现了高度自定义和灵活的验证码生成方式,让您的网站或应用轻松应对各类验证码 ...

  9. zkq 数学听课笔记

    线性代数 域 \(F\),OI 中常用的域是 \(\Z_{p^c}\). \(n\) 维向量 \(\vec x \in F^n\),其中 \(x_i \in F\),注意向量是列向量. \(F^n\) ...

  10. kettle从入门到精通 第二十七课 邮件发送

    1.我们平常在做数据同步的时候,担心转换或者job没有正常运行,需要加上监控机制,这个时候就会用到邮件功能. 下图是一个简单的测试邮件发送功能的转换.在kettle.properties文件中设置邮件 ...