2014-02-18 148 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