mysql 判读两个字符串是否存在交集(类似1,2,3字符串)

本文介绍了一种在SQL中实现集合交集检查的方法,通过创建两个存储过程`INTE_ARRAY`和`is_mixed`来判断两个字符串集合是否存在交集。`INTE_ARRAY`适用于较小的数据集,而`is_mixed`则用于处理更大的数据格式,如Text类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程如下:

DROP FUNCTION IF EXISTS  `INTE_ARRAY`;  
delimiter //  
-- 集合交集检查函数  
-- @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 FUNCTION `INTE_ARRAY` (setA varchar(255),setB varchar(255)) RETURNS int(1)  
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 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;  
//  
delimiter ;  

select INTE_ARRAY("1,3,5,9","8,2,3,7") as is_inte_array;  

解决数据格式存储存储大的问题 —Text

CREATE FUNCTION `is_mixed` (setA TEXT,setB TEXT) RETURNS int(1)  
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 TEXT;-- 临时检查数据集  
    DECLARE curt TEXT;-- 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 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;  
### 如何判断字符串是否是整数 为了验证一个字符串是否代表一个有效的整数,可以采用多种方法。一种常见的方式是在特定编程语言中编写函数来逐个检查字符并确保它们都在允许范围内。 对于 Java 来说,可以通过遍历给定字符串中的每个字符,确认其属于数字字符集的一部分[^2]: ```java private boolean isNumeric(String s) { for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if (!(ch >= '0' && ch <= '9')) { return false; } } return true; } ``` 然而,上述代码仅适用于无符号正整数的情况。如果要处理可能带有负号 `-` 或者正号 `+` 的情况,则需要额外考虑这些符号的存在及其位置合法性。另外,在某些情况下还需要排除前导零等问题。 更全面的做法可能是利用正则表达式来进行匹配操作。这种方式不仅能够简化逻辑结构而且易于扩展到其他类型的数值检测上。例如,在 Hive SQL 中通过正则表达式判断字符串是否为纯整数的形式如下所示[^5]: ```sql SELECT '123456' RLIKE '^\\\\d+$'; ``` 这里使用的模式 `'^\\\d+$'` 表示整个输入应该由一位或多位于开头直到结尾组成的十进制数字构成。注意这里的双反斜杠是因为SQL内部解析的原因而特别设置的转义序列。 在 Python 这样的高级脚本语言里也可以很方便地应用类似的思路: ```python import re def is_integer(s): pattern = r"^\s*[+-]?[0-9]+\s*$" match = re.match(pattern, s) return bool(match) print(is_integer(" +123 ")) # True print(is_integer("-456")) # True print(is_integer("789abc")) # False ``` 此段Python代码定义了一个名为 `is_integer()` 函数用于测试传入参数是否符合预期格式。它接受可选的加减号作为首位,并忽略首尾空白字符的影响。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值