This is working very well for me in MySql 5.5
CREATE TABLE split ( id INT, str VARCHAR(50) );
INSERT INTO split VALUES (1, 'Smith'), (2, 'Julio|Jones|Falcons'), (3,
'White|Snow'), (4, 'Paint|It|Red'), (5, 'Green|Lantern'), (6, 'Brown|bag');
DELIMITER |
CREATE PROCEDURE SplitColumnsToRows ()
BEGIN
DECLARE id1 INT (100);
DECLARE str1 VARCHAR (100);
DECLARE done INTEGER DEFAULT 0;
DECLARE tokens INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE token VARCHAR (100);
DECLARE cur CURSOR FOR
SELECT
id,
str
FROM
split;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
parse :
LOOP
FETCH cur INTO id1,
str1;
IF done = 1
THEN LEAVE parse;
END IF;
SET tokens =
(SELECT
LENGTH(str1) - LENGTH(REPLACE(str1, '|', '')) + 1);
DELETE
FROM
split
WHERE id = id1
AND str = str1;
SET i = 1;
WHILE
i <= tokens DO IF i = tokens
THEN SET token = str1;
ELSE SET token = SUBSTR(str1, 1, INSTR(str1, '|') - 1);
SET str1 = SUBSTR(str1, INSTR(str1, '|') + 1, LENGTH(str1));
END IF;
INSERT INTO split
VALUES
(id1, token);
SET i = i + 1;
END WHILE;
END LOOP parse;
CLOSE cur;
END |
DELIMITER;