2012-07-02 39 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你有沒有機會測試我的另一個命題'噸'包含多個下劃線? –