我有一个包含几个字段的MySQL表;像这样:
id name ton dyr
1 moo FRET_GTR_HYU ra
2 maa DER_GY_TR_DB fe
3 tee SAME_IQ tete
...
问题是列 ton 的每一行的内容都是独立的,但它们用符号“_”连接。
我想修改表格,将字段 ton 拆分为最终保留其他字段中的所有相同条目,但 ton 领域,像这样...
id name ton dyr
1 moo FRET ra
1 moo GTR ra
1 moo HYU ra
2 maa DER fe
2 maa GY fe
2 maa TR fe
2 maa DB fe
3 tee SAME tete
3 tee IQ tete
...
我试图修改这个page中给出的代码来执行这项工作,但由于我不是MySQL的专家,我无法按照自己的方式工作。在上面的链接中,代码适合于重写给定的两列,而不是任何其他字段。
有关如何修改代码的任何帮助,或以其他方式进行操作?
答案 0 :(得分:1)
您应该使用SUBSTRING_INDEX MySQL字符串函数。 以下内容应该返回您的要求:
INSERT INTO table2
SELECT id, name, SUBSTRING_INDEX(ton, '_', 1), dyr FROM table1
UNION
SELECT id, name, SUBSTRING_INDEX(ton, '_', -1), dyr FROM table1
答案 1 :(得分:1)
1)将table1结构复制到table2
2)将2个存储过程添加到数据库中。
CREATE PROCEDURE peixe()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE i INT;
DECLARE cursor_id CURSOR FOR SELECT id FROM table1 WHERE ton LIKE '%_%';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
OPEN cursor_id;
FETCH cursor_id INTO i;
REPEAT
CALL split_ton(i);
FETCH cursor_id INTO i;
UNTIL done END REPEAT;
CLOSE cursor_id;
END
CREATE PROCEDURE split_ton(i INT)
BEGIN
DECLARE str_name VARCHAR(50);
DECLARE str_ton VARCHAR(50);
DECLARE str_ton_el VARCHAR(50);
DECLARE str_dyr VARCHAR(50);
DECLARE ton_size INT;
SELECT name, ton, dyr
INTO str_name, str_ton, str_dyr
FROM table1 WHERE id=i;
SET ton_size = LENGTH(str_ton) - LENGTH(REPLACE(str_ton, '_', '')) + 1;
WHILE ton_size > 0 DO
SET str_ton_el = SUBSTRING_INDEX(str_ton, '_', -1);
SET str_ton = SUBSTRING_INDEX(str_ton, '_', ton_size - 1);
INSERT INTO table2 (id, name, ton, dyr) VALUES (i, str_name, str_ton_el, str_dyr);
SET ton_size = ton_size - 1;
END WHILE;
END
3)最后,执行以下语句:
CALL peixe
我认为,你已经完成了: - )