[adsense id=”0514458240″ width=”468″ height=”60″]
Data migrations from one database to another can give rise to unusual processing requests. In this example, a temporary table has been created and has been populated with data. The table consists of three columns: f1 int, f2 int and f3 which is a string. The 3rd column contains information in the form “a,b,c” or “a-b-c” or “a;b;c”. The information in the 3rd column must be expanded out to insert information into the live table with records { f1, f2, “a”}, {f1, f2, “b”} and {f1, f2, “c”}.
1 9 a,b,c 2 9 a;b;c 3 9 a-b-c
Should return
1 9 a 1 9 b 1 9 c 2 9 a 2 9 b 2 9 c 3 9 a 3 9 b 3 9 c
There are two ways to perform this action, the first is pre-loading the information into the database expand the data out using command line tools such as awk or create a store procedure which takes the data and merges it into the live table.
The sample code provided here deals with the second scenario.
DROP TABLE IF EXISTS tmp_info;
CREATE TABLE tmp_info(f1 int, f2 int, f3 varchar(20));
INSERT INTO tmp_info VALUES (1, 9, 'a,b,c');
INSERT INTO tmp_info VALUES (2, 9, 'a;b;c');
INSERT INTO tmp_info VALUES (3, 9, 'a-b-c');
DROP TABLE IF EXISTS t_info;
CREATE TABLE t_info(f1 int, f2 int, f3 varchar(20));
DROP PROCEDURE IF EXISTS appenddata;
DELIMITER $$
CREATE PROCEDURE appenddata()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a,b INT;
DECLARE lstart, lend INT;
DECLARE c VARCHAR(20);
DECLARE cur CURSOR FOR SELECT f1,f2,f3 FROM tmp_info;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
read_loop: LOOP
FETCH cur INTO a, b, c;
IF done THEN
LEAVE read_loop;
END IF;
-- Keep all using the same format
SET c = REPLACE(c, ";", ",");
SET c = REPLACE(c, "-", ",");
SET lstart = 1;
SET lend = LOCATE(",", c, lstart);
WHILE lend > 0 DO
INSERT INTO t_info(f1, f2, f3) VALUES (a, b, SUBSTRING(c, lstart, lend-lstart));
SET lstart = lend+1;
SET lend = LOCATE(",", c, lstart);
END WHILE;
IF c <> "" THEN
INSERT INTO t_info(f1, f2, f3) VALUES (a, b, SUBSTRING(c, lstart));
END IF;
END LOOP;
CLOSE cur;
END;
$$
DELIMITER ;
call appenddata();
SELECT * FROM t_info;
The output from this process is as follows:
f1 f2 f3 1 9 a 1 9 b 1 9 c 2 9 a 2 9 b 2 9 c 3 9 a 3 9 b 3 9 c





