Domanda

sto trasformare una vecchia insieme di dati in un nuovo database strutturato. Attualmente hanno dati in questo formato:

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

dove vari pattern sono delimitate dalle virgole prima, poi da tilde, e infine da caratteri pipe dello stesso campo (no staffe) all'interno del database esistente. Per esempio:

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

Voglio prendere quella stringa in ogni record e procedere come segue:

  1. Creare un nuovo record in una tabella esistente in base al largo ogni scissione e virgola
  2. Split ciascun token nuovamente la tilde, mettendo il primo pezzo in un campo e il secondo in un campo separato (non importa di scissione da tubi) nello stesso record

Non so se è ancora possibile, ma spero che sia. Inoltre sto sperando di avere a che fare solo una volta, come il nuovo sistema si occuperà di creare tutta questa merda automaticamente. Il mio sproc-fu è abbastanza terribile in MySQL, quindi ogni aiuto è molto apprezzato.

Grazie mille!

È stato utile?

Soluzione

Questa sembra una cosa abbastanza grave da fare in SQL, ma ecco uno script proof-of-concept.

Se gli sguardi di uscita giusta per te, sostituire il SELECT con un'istruzione INSERT appropriata e dovrebbe ottenere quello che vuoi.

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

Altri suggerimenti

Il modo non grave per farlo è questo:

load data infile '/tmp/your-data-file' into table yourtable fields terminated by '~' lines terminated by ';';
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top