1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CASE式をUPDATE文に対して使う

Last updated at Posted at 2023-03-31

「達人に学ぶ SQL徹底指南書」という本を読んで、SQLつよつよになるために勉強しています。
今回は第1章「CASE式のススメ」を読んだので、例題と一緒にまとめます。

この記事は、自分の勉強記録用なので、情報が間違っている可能性もあります。ご了承ください。

CASE式とは何か

CASE式は、SELECT 文などで使い、条件を上から順番にチェックしていき、最初に合致した条件に指定した結果を返します。

例題を解く

下記のようなテーブルがあったとします。

ID Name Age Gender
1 山田 太郎 25 男性
2 鈴木 あやこ 32 女性
3 佐藤 花子 40 NULL
4 中村 恵子 27 女性
5 小林 一夫 21 男性

このテーブルから、以下の条件に従って、更新用のSQLを作成します。

  1. Ageが30歳未満の場合、Genderカラムを”Unspecified”に更新する
  2. Ageが30歳以上で、かつGenderがNULLの場合、Genderカラムを”Unknown”に更新する
  3. Ageが30歳以上で、かつGenderがNULLでない場合、Genderカラムの値をそのまま保持する

上記の条件に対して、CASE式を使わないとなると、WHERE文で条件分岐を設定する必要があります。
例えば、1.を実現するSQLをWHEREを使って書くと、以下のようになります。

UPDATE customers SET gender = ”Unspecified” WHERE age > 30;

また、2.と3.についても、同様にSQL文を発行しなくてはならないので、パフォーマンスが悪くなります。

「達人に学ぶ SQL徹底指南書」では、次のように書かれています。

「WHERE句で条件分岐させるのは素人のやること。プロはSELECT句で分岐させる」

今回は表の更新なので、SELECT分ではなく、UPDATE文ですが、CASE式で分岐させることが出来ます。

以下のようになります。

UPDATE customers SET 
	gender = 
        CASE 
        	WHEN age < 30 THEN "Unspecified"
            WHEN age >= 30 AND gender IS NULL THEN "Unknown"
            WHEN age >= 30 AND gender IS NOT NULL THEN gender
        	ELSE NULL 
        END;

実行結果(正解)は、以下のようになります。

ID Name Age Gender
1 山田 太郎 25 Unspecified
2 鈴木 あやこ 32 女性
3 佐藤 花子 40 Unknown
4 中村 恵子 27 女性
5 小林 一夫 21 Unspecified

引き続き、SQLつよつよを目指して頑張ります。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?