「達人に学ぶ SQL徹底指南書」という本を読んで、SQLつよつよになるために勉強しています。
今回は第1章「CASE式のススメ」を読んだので、例題と一緒にまとめます。
この記事は、自分の勉強記録用なので、情報が間違っている可能性もあります。ご了承ください。
CASE式とは何か
CASE式は、SELECT 文などで使い、条件を上から順番にチェックしていき、最初に合致した条件に指定した結果を返します。
例題を解く
下記のようなテーブルがあったとします。
ID | Name | Age | Gender |
---|---|---|---|
1 | 山田 太郎 | 25 | 男性 |
2 | 鈴木 あやこ | 32 | 女性 |
3 | 佐藤 花子 | 40 | NULL |
4 | 中村 恵子 | 27 | 女性 |
5 | 小林 一夫 | 21 | 男性 |
このテーブルから、以下の条件に従って、更新用のSQLを作成します。
- Ageが30歳未満の場合、Genderカラムを”Unspecified”に更新する
- Ageが30歳以上で、かつGenderがNULLの場合、Genderカラムを”Unknown”に更新する
- 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つよつよを目指して頑張ります。