バナー画像

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より便利で使い勝手が良いものとなっていますが、多用したり深い階層迄を一度にこなそうとすると返って解り難くなってしまう傾向があります。

そのあたりをしっかりと理解したうえでこの記事を読んで使い方をマスターしてみてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。