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)||(LENGTH(trim(v_product_conditions))=0)
			 then set success_flag = 0;
				return success_flag;
		end if; 
		if (ISNULL(v_shop_tags) = 1)||(LENGTH(trim(v_shop_tags))=0)
			 then set success_flag = 0;
				return success_flag;
		end if; 
	set cd_length=LENGTH(v_product_conditions);
	 while cd_length >= 1  DO
				set check_str=SUBSTRING_INDEX(v_product_conditions,',',1);  -- 获取第一个子字符串
				if FIND_IN_SET(check_str,v_shop_tags) = 0   -- 0 表示未匹配上
					then  set success_flag=0;
					return success_flag;
				end if;
				set v_product_conditions=SUBSTRING(v_product_conditions,LENGTH(check_str)+2);  -- 获取剩余要匹配的字符串
				set cd_length=cd_length-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;

返回值:

  

  

猜你喜欢

转载自www.cnblogs.com/blogxiao/p/9251984.html