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

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

在现有数据库中同一字段(无括号)中的管子中,首先由分号划定了各种模式。例如:

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

我想在每个记录中取下该字符串,并执行以下操作:

  1. 基于每个半偏分开的现有表中创建新记录
  2. 再次将每个令牌分开,将第一件作品放入一个字段,将第二块放入一个单独的字段(我不在乎用管道分裂)在同一记录中

我不知道是否有可能,但我希望这样。我还希望只需要一次,因为新系统将自动处理所有这些废话。我的Sproc-Fu在MySQL中非常糟糕,因此,任何帮助都非常感谢。

非常感谢!

有帮助吗?

解决方案

在SQL中,这似乎是一件非常粗暴的事情,但这是概念验证脚本。

如果输出看起来正确,请用适当的插入语句替换选择,它应该为您提供所需的内容。

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');;

其他提示

非理性的方法是:

load data infile '/tmp/your-data-file' into table yourtable fields terminated by '~' lines terminated by ';';
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top