2012-07-02 36 views
0

我有一个包含几个字段的MySQL表;像这样:分割行字段mysql创建新列

id name ton   dyr 
1 moo FRET_GTR_HYU ra 
2 maa DER_GY_TR_DB fe 
3 tee SAME_IQ  tete 
... 

的问题是,对于列的每一行的内容是独立的,但它们与符号“_”加入。

我想修改表,分裂场落得保持所有相同的条目中的其他领域,但每行只有一个入口在领域,像这样...

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中是专家,我不能够得到它的工作我的方式。在上面的链接中,给出的代码适合重写给定的两列,而不是其他任何字段。

如何修改代码或以其他方式做任何帮助?

回答

1

1)复制table1的结构,以表2

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 

而且我觉得,你:-)

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 
+0

哇完成!这正是我正在寻找的命令......它工作的很好,但我意识到在某些行中我得到了超过2条记录,所以它不会将它们分开。我将编辑问题 – peixe

+0

现在你需要更聪明的东西。例如,递归函数执行(n + 1)次,其中n =吨中出现次数'_'。 –

+0

@peixe你有没有机会测试我的另一个命题'吨'包含多个下划线? –