UPDATEを実行する際に「複数のレコードで複数のカラムのデータ」を一度に変更したいと思ったことはありませんか?
SQLに慣れていない人のコードを見てみると、UPDATE文をカラム毎に作成しそれをループさせて回す方法が使われていることがあります。
しかしCASEを使うことでもう少し簡単に一つのクエリで複数のレコードで複数のカラムのデータを同時に変更することが出来ます。
そこで今回は「CASEを使って複数のデータを同時にUPDATEする」方法について解説してみたいと思います。
CASEとは
まずは「CASE」についての説明をしていきます。
CASEは多言語で使用されている条件分岐ですが、どのプログラム言語でもCASEを使う際には「条件がAに当てはまればAルート、Bに当てはまればBルートを実行する」という形で使用します。
プログラミングの際に「switch~case」という命令を記述した経験がある方も多いのではないでしょうか。
このCASEですが、もちろんSQLでも使用できます。
しかしSQLでは他のプログラム言語と違い、「switch文」というものはありません。
switch部分にあたるワードがCASEになり、CASEにあたる部分は”THEN”というワードに置き換えられます。
この辺りは次の工程で解説していきますので、今はまだワードだけ覚えておく程度で構いません。
CASE式の使い方
それではSQLにおけるCASE式の使い方について解説していきます。
今回はUPDATEでのCASE式の使い方なので、サンプルなどの記述も全てUPDATEで揃えて解説していきます。
CASEは様々なクエリで使用できるため、UPDATEのみ使用可能だと勘違いしないようにしてください。
CASE式の記述方法については次の通りです。
CASE [カラム] WHEN [条件A] THEN [ルートA] WHEN [条件B] THEN [ルートB] ・ ・ ・ ELSE [どの条件にも一致しない場合のルート] END
CASEでカラムを指定し「WHEN」と「THEN」を使ってルートを指定します。
ELSEは必要に応じて付けることが可能ですが、必ずしもつけなければいけないということはありません。
ではサンプルコードで見てみましょう。
サンプルコードで使用するテーブルは以下の通りです。
id name job salary ----------- -------------------- -------------------- ----------- 1 Alex sales NULL 2 Tomath programmer NULL 3 Smith designer NULL 4 Ben sales NULL
今回のサンプルでは職業(job)に応じて給与(salary)の設定を行っています。
それでは早速見てみましょう。
UPDATE sample_table SET salary = CASE job WHEN 'programmer' THEN '300000' WHEN 'designer' THEN '250000' WHEN 'sales' THEN '200000' END ; GO (4 行処理されました) select * from sample_table go id name job salary ----------- -------------------- -------------------- ----------- 1 Alex sales 200000 2 Tomath programmer 300000 3 Smith designer 250000 4 Ben sales 200000
今回のサンプルではルートを3通り作りそれぞれの職種に対して給与設定を行いましたが、実行結果を見てみると全てのレコードが条件毎に変更されていることが確認できます。
CASEの入れ子
CASE式は入れ子にすることも出来ます。
入れ子にする場合には以下のようにします。
CASE WHEN [条件A] THEN CASE WHEN [条件Aa] THEN [ルートAa] WHEN [条件Ab] THEN [ルートAb] ・ ・ ・ ELES [どの条件にも一致しない場合のルート] END WHEN [条件B] THEN CASE WHEN [条件Ba] THEN [ルートBa] WHEN [条件Bb] THEN [ルートBb] ・ ・ ・ ELSE [どの条件にも一致しない場合のルート] END ・ ・ ・ ELSE [どの条件にも一致しない場合のルート] END
このようにすることで、「条件Aに該当するものは更にその下の条件分岐で判断、条件Bに該当するものは更にその下の条件分岐で‥‥」と詳細な条件設定が可能となります。
また入れ子にする場合に階層に制限はありません。
しかし階層を深くし過ぎると返って解り難くなってしまうため、多くても3階層(入れ子2個)までに留めておいた方が良いでしょう。
CASE式とワイルドカード
CASE式にはワイルドカードも使用することが出来ます。
ワイルドカードといえばLIKE句ですが、先ほどのテーブルを例にLIKE句を使ったCASE式を記述すると次のようになります。
UPDATE sample_table SET name = CASE WHEN name LIKE 'Al%' THEN 'Porl' WHEN name LIKE 'To%' THEN 'Sophia' ELSE 'unknown' END ; GO (4 行処理されました) id name job salary ----------- -------------------- -------------------- ----------- 1 Porl sales 200000 2 Sophia programmer 300000 3 unknown designer 250000 4 unknown sales 200000
ワイルドカードを使用して曖昧検索をかけた「Alex」と「Tomath」及びどの条件にも一致しなかった場合の処理がそれぞれ実行されていることが確認できます。
CASE式ではこのように様々な式を記述することが可能です。
まとめ
今回は「CASEを使って複数のデータを同時にUPDATEする」について解説してきましたがいかがでしたか?
CASE式はWHEREより便利で使い勝手が良いものとなっていますが、多用したり深い階層迄を一度にこなそうとすると返って解り難くなってしまう傾向があります。
そのあたりをしっかりと理解したうえでこの記事を読んで使い方をマスターしてみてください。