在MySQL中使用多分隔字符串并转换为多个记录

时间:2010-12-18 00:26:47

标签: mysql stored-procedures delimited-text data-conversion

我正在将旧数据集转换为新结构化数据库。目前,他们拥有以下格式的数据:

[quantity int]~[var1 string]|[var2 string optional]|[var3 string optional];(etc);
[quantity]~[var1]|[var2]|[var3]

其中各种模式首先用分号分隔,然后用tildes分隔,最后用现有数据库中同一字段(无括号)内的管道字符分隔。例如:

3~S|Red|Top;1~S|Blue|Top; ... etc ... ;20~XL|Green|Left

我想在每条记录中删除该字符串并执行以下操作:

  1. 根据每个分号拆分在现有表中创建新记录
  2. 用波浪号再次拆分每个标记,将第一个标记放入一个字段,将第二个标记放入一个单独的字段(我不关心通过管道分割)在同一记录中
  3. 我不知道它是否可能,但我希望它是。我也希望只需要这样做一次,因为新系统将自动创建所有这些垃圾。我的sproc-fu在MySQL中非常糟糕,所以非常感谢任何帮助。

    非常感谢!

2 个答案:

答案 0 :(得分:1)

这似乎是SQL中非常重要的事情,但这是一个概念验证脚本。

如果输出看起来正确,请用适当的INSERT语句替换SELECT,它应该可以得到你想要的结果。

delimiter ;;

drop procedure if exists load_crazy_stuff;;

create procedure load_crazy_stuff(in s longtext)
begin
   declare pos       int;
   declare record    longtext;
   declare leftpart  int;
   declare rightpart longtext;
   set s = concat(s,';');
   while length(s)>0 DO
     set pos       = instr(s,';');
     set record    = left(s,pos-1);
     set s         = substr(s,pos+1);
     set pos       = instr(record,'~');
     set leftpart  = left(record,pos-1);
     set rightpart = substr(record,pos+1);
     select leftpart, rightpart;
   end while;
end;;

call load_crazy_stuff('3~S|Red|Top;1~S|Blue|Top;20~XL|Green|Left');;

答案 1 :(得分:1)

这样做的非粗略方式是:

load data infile '/tmp/your-data-file' into table yourtable fields terminated by '~' lines terminated by ';';