mysql - 在MySQL中获取多分隔字符串并转换为多条记录

标签 mysql stored-procedures csv data-conversion

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

[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 中似乎是一件相当恶心的事情,但这里有一个概念验证脚本。

如果输出对您来说是正确的,请将 SELECT 替换为适当的 INSERT 语句,它应该会得到您想要的结果。

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

关于mysql - 在MySQL中获取多分隔字符串并转换为多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475894/

相关文章:

sql - 在 MySQL : How to pass a table name as stored procedure and/or function argument?

sql - Teradata BTEQ : IF conditon , 使用运行时实际参数验证 SP 编译并导出 DDL

json - 还在努力用 jq 解析 JSON

java - 从mysql数据库获取数据后格式化

mysql - rails 4 : Using ActiveRecord object from one thread in another

mysql - 如果其中一个表与另一个表匹配,则选择表中的行

php - PHP 表中的总和列

c# - Oracle 存储过程、SYS_REFCURSOR 和 NHibernate

c# - 从 CSV 数据中删除尾随逗号

ruby - 如何从 Ruby 中的给定行 n 开始读取文件(CSV)