【问题标题】:Search in CSV with MySQL使用 MySQL 在 CSV 中搜索
【发布时间】:2011-12-12 10:35:45
【问题描述】:

我知道这可以使用 FIND_IN_SET 来完成。但我需要一些不同的东西。

我的一个字段包含用逗号分隔的 6 位数字。其他字符串最多有 5 个值,以逗号分隔。

所以我想获取匹配值的计数。

喜欢:

Database value: 1,2,3,4,5,6  
Search Value:   1,2,3,4

这将给出 4。

Database value: 1,2,3,4,5,6
Search Value:   1,2,3,4,6

这将给出 5。

Database value: 1,2,3,4,5,6
Search Value:   1,4

这将给出 2。

我正在使用 InnoDB 表。

【问题讨论】:

    标签: mysql search csv sql


    【解决方案1】:

    如果您不使用 InnoDB 表,我会建议在某些描述中使用 full text search。但是你使用的是 InnoDB!

    也就是说我会沿着user defined function 的路线走,特别是一个存储函数。幸运的是,我已经从previous post 中得到了一个。我已经对其进行了调整,以便您可以传入任何分隔符。由于它是一个函数,因此您可以像使用任何其他 MySQL 函数一样在查询中使用它。

    希望对你有帮助。

    DROP FUNCTION IF EXISTS `CompareStrings`;
    
    DELIMITER $$
    
    CREATE FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255), delimiter VARCHAR(1)) RETURNS double
    READS SQL DATA
    BEGIN
    DECLARE cur_position INT DEFAULT 1 ; 
    DECLARE remainder TEXT;
    DECLARE cur_string VARCHAR(255);
    DECLARE delimiter_length TINYINT UNSIGNED;
    DECLARE total INT;
    DECLARE result DOUBLE DEFAULT 0;
    DECLARE string2 VARCHAR(255);
    
    SET remainder = str1;
    SET string2 = concat(delimiter,trim(str2),delimiter);
    SET delimiter_length = CHAR_LENGTH(delimiter);
    SET cur_position = 1;
    
    WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
        SET cur_position = INSTR(remainder, delimiter);
        IF cur_position = 0 THEN
            SET cur_string = remainder;
        ELSE
            SET cur_string = concat(delimiter,LEFT(remainder, cur_position - 1),delimiter);
        END IF;
        IF TRIM(cur_string) != '' THEN
            set result = result + (select instr(string2,cur_string) > 0);
        END IF;
        SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
    END WHILE;
    
    RETURN result;
    
    END$$
    
    DELIMITER ;
    

    然后你可以运行类似的东西:

    select CompareStrings('1,2,3,4,5,6','1,2,3,4',',')
    

    你会得到 4 和:

    select CompareStrings('1,2,3,4,5,6','1,2,3,4,6',',')
    

    你会得到 5 个

    【讨论】:

      【解决方案2】:

      我创建了 1 个函数,其中 1 个是从 mysql 站点找到的:

      这个函数给出了字符串中给定位置的值,并定义了分隔符。

      DELIMITER $$
      
      CREATE FUNCTION `SplitString`(x varchar(255), delim varchar(12), pos int) RETURNS varchar(255) CHARSET latin1
      return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '')
      

      此功能使用上述功能并服务于我的目的。

      DELIMITER $$
      
      CREATE FUNCTION `get_matched`(my_num varchar(100), to_match_num VARCHAR(100)) RETURNS int(11)
      BEGIN
      
      DECLARE temp, total INT;
      SET total=0;
      SET temp = IF(FIND_IN_SET(SplitString(my_num,',',1), to_match_num)>0,1,0);
      SET total = total+ temp;
      
      SET temp = IF(FIND_IN_SET(SplitString(my_num,',',2), to_match_num)>0,1,0);
      SET total = total+ temp;
      
      SET temp = IF(FIND_IN_SET(SplitString(my_num,',',3), to_match_num)>0,1,0);
      SET total = total+ temp;
      
      SET temp = IF(FIND_IN_SET(SplitString(my_num,',',4), to_match_num)>0,1,0);
      SET total = total+ temp;
      
      SET temp = IF(FIND_IN_SET(SplitString(my_num,',',5), to_match_num)>0,1,0);
      SET total = total+ temp;
      
      SET temp = IF(FIND_IN_SET(SplitString(my_num,',',6), to_match_num)>0,1,0);
      SET total = total+temp;
      
      RETURN total;
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-29
        • 1970-01-01
        • 2017-12-18
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 2017-08-22
        • 2014-03-29
        相关资源
        最近更新 更多