mysql 判断字符串是否为其他字符串的子集
1.mysql 提供单个用逗号隔开判断某个字符串是否包含在其他字符串的之内:FIND_IN_SET('需要匹配的字符串','源字符串');
demo: select FIND_IN_SET('111','111,22,3333,43') from user; -- user 是测试表名
返回值:
select FIND_IN_SET('7777','111,22,3333,43') from user;
返回值:
总结: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;
返回值:
select fn_sos_product_in_shop('111,55','111,222,333') from sos_shop;
返回值:
重点:1.为什么不用length 而用char_length length统计的是字节长度,在mysql数据库中一个汉字占三个字符,当都不是汉字的可以用length.char_length 统计字符,不管是否是汉字统计的长度都是一样的。
2.对于substring 为什么要加2?