我正在将旧数据集转换为新结构化数据库。目前,他们拥有以下格式的数据:
[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
我想在每条记录中删除该字符串并执行以下操作:
我不知道它是否可能,但我希望它是。我也希望只需要这样做一次,因为新系统将自动创建所有这些垃圾。我的sproc-fu在MySQL中非常糟糕,所以非常感谢任何帮助。
非常感谢!
答案 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 ';';