mysql 不认的字符串_mysql 判断字符串是否为其他字符串的子集

本文介绍了如何使用MySQL的FIND_IN_SET函数来判断一个字符串是否包含在另一个字符串内,以及当需要判断多个字符串子集时,自定义函数fn_sos_product_in_shop的实现过程。该函数通过循环和SUBSTRING_INDEX进行逐个匹配,确保所有子串都在源字符串中。文章还探讨了使用CHAR_LENGTH而非LENGTH的原因,以及在处理字符串时的注意事项。
摘要由CSDN通过智能技术生成

1.mysql 提供单个用逗号隔开判断某个字符串是否包含在其他字符串的之内:FIND_IN_SET('需要匹配的字符串','源字符串');

demo: select FIND_IN_SET('111','111,22,3333,43') from user;  -- user 是测试表名

返回值:

dcd5b2275389192d1bcc7991dae2e3ef.png

select FIND_IN_SET('7777','111,22,3333,43') from user;

返回值:

7d781da18627321a218d4479262f0721.png

总结:FIND_IN_SET 方法 若包含则返回1 否则返回0;

2:当遇到多个字符串进行匹配的时候,FIND_IN_SET 并不能符合需求,这里是韦恩图的子集逻辑

demo   strA='11,2,5'   strB='0,11,6,5,2,8'    判断 strA是否是strB的子集

mysql 自带函数:SUBSTRING_INDEX('11,2,5' ,0)  返回值:11

SUBSTRING(strA,3)   返回:‘2,5’

思路:将strA中的子字符串逐一和strB中的字符串进行比对,只要有一个不存在则返回失败

第一步:SUBSTRING_INDEX(strA,1)方法能获取通过逗号分割的字符串,temp_str=SUBSTRING_INDEX(strA,1);

第二步:将获取的字符串用FIND_IN_SET (temp,strB) 进行匹配,若没有与之匹配则将标志位设为失败状态,并且return

第三步:将已经匹配过的字符串丢弃SUBSTRING(strA,tempStrLen+1);

重复上述步骤

函数:

drop function if EXISTS fn_sos_product_in_shop;

create function fn_sos_product_in_shop(v_product_conditions varchar(255),v_shop_tags varchar(255)) RETURNS int(1)

begin

DECLARE success_flag int DEFAULT 0; -- 子集标志位 0 默认不是子集,1 是子集

DECLARE cd_length INT DEFAULT 0; -- 被截取之后字符串的剩余长度

DECLARE temp_lenth int DEFAULT 0; -- 临时截取的字符长度

DECLARE check_str varchar(255);-- 临时检查数据集

DECLARE live_str varchar(255); -- 剩余的字符串

if (ISNULL(v_product_conditions) = 1)||(CHAR_LENGTH(trim(v_product_conditions))=0)

then set success_flag = 0;

return success_flag;

end if;

if (ISNULL(v_shop_tags) = 1)||(CHAR_LENGTH(trim(v_shop_tags))=0)

then set success_flag = 0;

return success_flag;

end if;

set cd_length=CHAR_LENGTH(v_product_conditions);

while cd_length >= 1 DO

set check_str=SUBSTRING_INDEX(v_product_conditions,',',1); -- 获取第一个子字符串

if  CHAR_LENGTH(trim(check_str))>0  -- 这是为了过滤掉空的分割 如:'aaa,,bbb' 中间有多个空逗号

if FIND_IN_SET(check_str,v_shop_tags) = 0 -- 0 表示未匹配上

then set success_flag=0;

return success_flag;

end if;

end if;

set v_product_conditions=SUBSTRING(v_product_conditions,CHAR_LENGTH(check_str)+2); -- 获取剩余要匹配的字符串

set cd_length=cd_length-CHAR_LENGTH(check_str)-1; -- 剩余的字符长度

set success_flag=1; -- 成功

end while;

return success_flag;

end ;

0 :表示不是子集 1 表示是子集

select  fn_sos_product_in_shop('111','111,222,333') from user;

返回值:

0016ba347b43eb64c66b5304b6bc16a8.png

select fn_sos_product_in_shop('111,55','111,222,333') from sos_shop;

返回值:

fde8d596f2ab714b6a3276759cba5d18.png

重点:1.为什么不用length 而用char_length length统计的是字节长度,在mysql数据库中一个汉字占三个字符,当都不是汉字的可以用length.char_length 统计字符,不管是否是汉字统计的长度都是一样的。

2.对于substring 为什么要加2?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值