zoukankan      html  css  js  c++  java
  • 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?

      

      

      

  • 相关阅读:
    day35—JavaScript操作元素(创建、删除)
    day34—JavaScript实现DOM操作
    day33—前端开发的模块化和组件化
    day32—CSS多列布局学习
    day31—CSS Reset 与页面居中布局
    JVM(18)之 Class文件
    JVM(17)之 准备-解析-初始化
    JVM(16)之 双亲委派模型
    JVM(15)之 类加载器
    JVM(14)之 类加载机制
  • 原文地址:https://www.cnblogs.com/blogxiao/p/9251984.html
Copyright © 2011-2022 走看看