最近做數據遷移,一個蛋疼的問題,哪個大俠設計的表,一個字段用逗號分隔存儲了一些信息,遷移的時候,要把這個已逗號分隔的內容解析出來,插入到另外一張表中。非常蛋疼。
還好,發現有人提供類似的存儲過程+函數形式,可以實現。通過修改,可以使用。
-- 函數:func_get_categoryName DELIMITER $$ DROP FUNCTION IF EXISTS func_get_categoryName $$ CREATE FUNCTION func_get_categoryName (f_caid varchar(50)) RETURNS varchar(50) BEGIN CASE f_caid WHEN 1 THEN RETURN '火箭'; WHEN 2 THEN RETURN '大炮'; WHEN 3 THEN RETURN '輪船'; WHEN 4 THEN RETURN '飛機'; WHEN 5 THEN RETURN '潛水艇'; WHEN 6 THEN RETURN '航空母艦'; ELSE RETURN '未知'; END CASE; END$$ DELIMITER $$ -- 函數: func_get_imgUrl DELIMITER $$ DROP FUNCTION IF EXISTS func_get_imgUrl $$ CREATE FUNCTION func_get_imgUrl (f_caid varchar(50)) RETURNS varchar(255) BEGIN DECLARE imgUrl varchar(255) default ''; select img into imgUrl from crm_category where id=f_caid; RETURN imgUrl; END$$ DELIMITER $$ -- 函數:func_split_TotalLength DELIMITER $$ DROP FUNCTION IF EXISTS func_split_TotalLength $$ CREATE FUNCTION func_split_TotalLength (f_string varchar(1000),f_delimiter varchar(5)) RETURNS int(11) BEGIN return 1+(length(f_string) - length(replace(f_string,f_delimiter,''))); END$$ DELIMITER $$ -- 函數:func_split DELIMITER $$ DROP function IF EXISTS func_split $$ CREATE FUNCTION func_split (f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8 BEGIN -- 拆分傳入的字符串,返回拆分後的新字符串 declare result varchar(255) default ''; set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1)); return result; END$$ DELIMITER $$; -- 存儲過程:splitString DELIMITER $$ DROP PROCEDURE IF EXISTS `splitString` $$ CREATE PROCEDURE `splitString` (IN f_string varchar(1000),IN idstr varchar(50), IN f_delimiter varchar(5)) BEGIN -- 拆分結果 declare cnt int default 0; declare i int default 0; set cnt = func_split_TotalLength(f_string,f_delimiter); DROP TABLE IF EXISTS `tmp_split`; create temporary table `tmp_split` (`status` varchar(128) not null,`ids` varchar(50) ) DEFAULT CHARSET=utf8; while i < cnt do set i = i + 1; insert into tmp_split(`status`,`ids`) values (func_split(f_string,f_delimiter,i),idstr); end while; END$$ DELIMITER $$; -- 插入分隔數據 DELIMITER $$ DROP PROCEDURE IF EXISTS `valinsert` $$ CREATE PROCEDURE `valinsert` () BEGIN declare siteid varchar(50) default ''; declare tmpName varchar(100) default '' ; declare tmpCategory varchar(500) default '' ; -- 定義遊標 declare cur1 CURSOR FOR SELECT category FROM crm_site where category is not null; DECLARE cur2 CURSOR FOR SELECT id FROM crm_site where category is not null; declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpName = null; -- 開遊標 OPEN cur1 ; OPEN cur2; FETCH cur1 INTO tmpCategory; FETCH cur2 INTO siteid; -- 清空帶插入的表 WHILE ( tmpName is not null) DO -- 調取分隔字段的存儲過程splitString call splitString(tmpCategory,siteid,","); INSERT INTO crm_category (name,img,site_id,sort,create_time) SELECT func_get_categoryName(status),func_get_imgUrl(status),ids,status,now() from tmp_split; FETCH cur1 INTO tmpCategory; FETCH cur2 INTO siteid; END WHILE; CLOSE cur1; CLOSE cur2; select * from crm_category; END$$ DELIMITER $$; call valinsert();