mysqlでマルチリミテッド文字列を使用して、複数のレコードに変換します
-
11-10-2019 - |
質問
古いデータセットを新しく構造化されたデータベースに変換しています。現在、彼らはこの形式のデータを持っています:
[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 ';';
所属していません StackOverflow