Prendere una stringa multi-delimitata in MySQL e convertire in più record
-
11-10-2019 - |
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:
- Creare un nuovo record in una tabella esistente in base al largo ogni scissione e virgola
- 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!
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 ';';