Mysql 将分隔字符串值拆分为行

Mysql 将分隔字符串值拆分为行,mysql,sql,database,delimiter,Mysql,Sql,Database,Delimiter,一些外部数据供应商想给我一个数据字段-管道分隔的字符串值,我发现这很难处理 如果没有应用程序编程语言的帮助,是否有方法将字符串值转换为行 但是,有一个困难,该字段具有数量未知的分隔元素 问题中的DB引擎是MySQL 例如: Input: Tuple(1, "a|b|c") Output: Tuple(1, "a") Tuple(1, "b") Tuple(1, "c") 这可能不像我最初想的那么难 这是一种通用方法: 计算分隔符length(val)-length(replace(val,

一些外部数据供应商想给我一个数据字段-管道分隔的字符串值,我发现这很难处理

如果没有应用程序编程语言的帮助,是否有方法将字符串值转换为行

但是,有一个困难,该字段具有数量未知的分隔元素

问题中的DB引擎是MySQL

例如:

Input: Tuple(1, "a|b|c")

Output:

Tuple(1, "a")
Tuple(1, "b")
Tuple(1, "c")

这可能不像我最初想的那么难

这是一种通用方法:

  • 计算分隔符
    length(val)-length(replace(val,'.','')的出现次数
  • 循环多次,每次获取一个新的分隔值并将该值插入第二个表
  • 通过以下方式使用此功能:

    用法


    您需要一个循环来解决您的问题。

    虽然您的问题可能已经解决了很长时间,但我一直在寻找解决您遇到的问题的方法。我通过使用
    CHAR\u LENGTH()
    而不是
    LENGTH()
    解决了这个问题,并对字符串中的多字节字符(如德语Umlauts)进行了轻微的调整


    @YuriyGalanter的可能重复项不是重复项。我的问题是数据转换,而不是数据提取。同样的问题-拆分字符串。将结果插入表中,这是许多SQL方言中的常见任务。只要谷歌“MySQL分割字符串”看看,如果事先知道分隔值的数量,当然不会很难。但在我的情况下,数量是未知的。物品的数量无关紧要。以该SO答案中提到的为例。它接受具有任意数量元素的字符串。这只是一个例子,如果它不适合你,还有很多其他的例子。例如,您可能需要一个函数,该函数返回一个表,您可以从中向自己的表中插入拆分数据。
     CREATE FUNCTION SPLIT_STR(
     x VARCHAR(255),
     delim VARCHAR(12),
     pos INT
     )
       RETURNS VARCHAR(255)
       RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
    delim, '');
    
     SELECT SPLIT_STR(string, delimiter, position)
    
    DELIMITER $$
        CREATE FUNCTION SPLIT_STRING(val TEXT, delim VARCHAR(12), pos INT) RETURNS TEXT
        BEGIN
            DECLARE output TEXT;
            SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(val, delim, pos), CHAR_LENGTH(SUBSTRING_INDEX(val, delim, pos - 1)) + 1), delim, '');
            IF output = '' THEN
                SET output = null;
            END IF;
            RETURN output;
        END $$
    
        CREATE PROCEDURE TRANSFER_CELL()
        BEGIN
            DECLARE i INTEGER;
            SET i = 1;
            REPEAT
                INSERT INTO NewTuple (id, value)
                SELECT id, SPLIT_STRING(value, '|', i)
                FROM Tuple
                WHERE SPLIT_STRING(value, '|', i) IS NOT NULL;
                SET i = i + 1;
            UNTIL ROW_COUNT() = 0
            END REPEAT;
        END $$
    DELIMITER ;
    
    CALL TRANSFER_CELL() ;
    
    DROP FUNCTION SPLIT_STRING ;
    DROP PROCEDURE TRANSFER_CELL ;