2014-02-18 50 views
0

有幾個解決方案可以做到這一點,但我的情況有點不同。
例如,

數據樣本
表:數據從逗號分隔文本創建表

suid(bigint), start(bigint), end(bigint), route(text) 
123, 111, 112, '1111, 1112, 1113, 1114' 
123, 114, 115, '2221, 2222, 2223' 
133, 121, 122, '331, 332, 333' 

預期結果
需要創建一個表:newdata

suid(bigint), start(bigint), end(bigint), road_seg1(int), road_seg2(int) 
123, 111, 112, 1111, 1112 
123, 111, 112, 1112, 1113 
123, 111, 112, 1113, 1114 
123, 114, 115, 2221, 2222 
123, 114, 115, 2222, 2223 
133, 121, 122, 331, 332 
133, 121, 122, 332, 333 


所以我需要{第一,第二} {第二,第三},{第三,第四} .....從路線(文本)
路線(文本)項可以proboblaly最多有100個項目,但項目的總數是隨機
任何幫助將不勝感激。我正在使用MySql。
謝謝。

+0

我建議你使用awk來改變你的文件到所需的格式,然後加載它。 – Turophile

回答

1

如果有這種路口的數量有限,你可以用一個相當複雜的查詢做到這一點:

select d.suid, s.start, s.end, 
     substring(substring_index(route, ', ', n.n), ', ', -1) as road_seg1, 
     substring(substring_index(route, ', ', n.n+1), ', ', -1) as road_seg2 
from data d cross join 
    (select 1 as n union all select 2 union all select 3 
    ) n 
where length(replace(route, ', ', ', x')) - length(route) <= n.n; 

substring_index()嵌套調用提取從字符串的第n個和第n + 1項。查詢查找的項目總數由子查詢n定義(在本例中爲3,但可以添加更多值)。 where子句選擇的值小於列表中項目的數量。

+0

非常感謝,但是如果我不知道路線(文本)中會有多少物品會怎麼樣?我仍然可以使用這個? – user3230889

+0

@ user3230889。 。 。如果有一個合理的最大值,例如10,那麼你可以擴展'n'來使用它。如果沒有,您可能想要使用存儲過程方法。 –

+0

@ Gordon Linoff max可能高達100.我不熟悉存儲的方法。我對此很新。 :) – user3230889

0

爲了完整起見,這裏是awk節目,我建議將輸入數據:

BEGIN       
    {FS=","; OFS=","}    
    {       
    gsub(/'/,"");    
    for(i=4;i<=NF-1;i++){  
     print $1,$2,$3,$i,$(i+1) ; 
     };       
    }       

給出的測試數據輸出:

 
123, 111, 112, 1111, 1112 
123, 111, 112, 1112, 1113 
123, 111, 112, 1113, 1114 
123, 114, 115, 2221, 2222 
123, 114, 115, 2222, 2223 
133, 121, 122, 331, 332 
133, 121, 122, 332, 333 
+0

注意:根據你如何運行這個,你可能需要用'\ x27'或'\ 047'替換單引號。 – Turophile