【MySQL】INSERTやUPDATEで便利なSQL関数(フロー制御編)
こんにちは、シーブレインinoueです。
馬車道界隈も春休みの親子連れでにぎわっています。
4月ももう3日、新学年スタートももうすぐですね。桜も咲いて、ああ春だわあ。
さて、今回はSQLで使用できるフロー制御関数について紹介します。
というのも、ここ最近はとあるシステムのデータ移行の仕事を担当しておりまして、
"INSERT INTO new(...) SELECT ... FROM old WHERE ...;"
といったSQLクエリをひたすら書いております。
何のデータ構造も値も変えない移行なら、ダンプデータを取得して新しいサーバで展開するだけなのですが、システムの性能を向上するために、様々な変換処理が今回は必要で…。
現行DBのいただけない部分を解消するまたとないチャンス、ではありますが、
正しくデータ移行できないと新しいシステムが正常に動かなくなるので非常に緊張する作業です。
というわけで、「いかにシステマチックにデータ移行できるか」というのがこういった作業では重要になってきます。
そこで活用したいのがSQL関数たち。移行ルールをSQLクエリに記述すればよいので、楽ちんです。
CASE ... WHEN ... THEN ... END
この関数では、複数の条件を用意して、「これにマッチしたらこの値にする」といったことが可能です。
たとえば、マスタのIDが入れ替わるので、「1を2、2を3、3を2,4を1にして他はそのままにしたい」という場合があったとします。
その場合は次のように記述します。
INSERT INTO new (field1)
SELECT
CASE o.field1
WHEN 1 THEN 2
WHEN 2 THEN 3
WHEN 3 THEN 2
WHEN 4 THEN 1
ELSE o.field1
FROM old o;
IF
IF(expr1,expr2,expr3) - この関数は、expr1が正の場合 expr2 の値を返し、それ以外の場合はexpr3の値を返します。
ネストも可能なので、複雑な条件分岐も記述できます。
IFNULL
IFNULL(expr1,expr2) - この関数では expr1 が NULLでない場合はそのまま expr1 を返し、 NULLならば expr2 を返します。
NULLを許可していたテーブルからNULL不許可のテーブルへデータを移行する際に重宝する関数です。
INSERT INTO new (field1) SELECT IFNULL(o.field1, '') from old o;
以上、簡単に3つ紹介しました。
関数を使って条件分岐をする場合、処理がすっきりする分SQLクエリは複雑で長くなってしまうので、
インデントを上手に使って見やすいクエリを書いておくのもポイントです。
次回は文字列関数について紹介したいと思います。