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

时间:2013-08-19 00:05:03

标签: mysql sql database

一些外部数据供应商希望给我一个数据字段 - 管道分隔的字符串值,我觉得很难处理。

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

然而,存在一个困难,该字段具有未知数量的分隔元素。

有问题的数据库引擎是MySQL。

例如:

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

Output:

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

3 个答案:

答案 0 :(得分:3)

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

这是一般方法:

  1. 计算分隔符length(val) - length(replace(val, '|', ''))
  2. 的出现次数
  3. 循环多次,每次抓取一个新的分隔值并将值插入第二个表。

答案 1 :(得分:3)

Federico Cargnelutti使用此功能:

 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)

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

答案 2 :(得分:0)

虽然你的问题可能已经很久了,但我一直在寻找解决你遇到的同样问题的方法。我在procedure referenced here的帮助下解决了这个问题,稍微适应了使用CHAR_LENGTH()代替LENGTH()来提供字符串中的多字节字符(例如德语元音)。

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 ;