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?

  

 

  

 

 

  

posted @ 2018-07-02 00:48  zero_and_one  阅读(991)  评论(0编辑  收藏  举报