从逗号分隔文本创建表

时间:2014-02-18 03:16:03

标签: mysql sql

有几个解决方案可以做到这一点,但我的情况有点不同。
例如,

数据样本
表:数据

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


所以我需要{route,second},{second,third},{third,4th} ..... from route(text)
路线(文字)物品最多可以包含100件物品,但物品总数是随机的
任何帮助将不胜感激。我正在使用MySql。
感谢。

2 个答案:

答案 0 :(得分: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子句选择n的值小于列表中的项目数。

答案 1 :(得分: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