はじめに
「達人に学ぶSQL徹底指南書第2版」におけるCASE式に関する箇所で、
理解が一度詰まった部分を、理解を整理するためにアウトプットとして書いています。
CASE式を用いて異なる条件の集積を求める方法を後半で記述しています。
学び始めて1週間経ってない超初心者なので間違っていたらご指摘いただけると嬉しいです
CASE式の基本的な文法
CASE式とはSQLにおける条件分岐を記述するための重要で便利な技術。
CASE式の書式には、以下の2つがある。
単純CASE式 (simple case)
CASE color
WHEN '1' THEN '白'
WHEN '2' THEN '黒'
ELSE 'その他' END
単純CASEの方が簡潔に書けるが、できることも限られる。
検索CASE式 (searched case)
CASE WHEN color = '1' THEN '白'
WHEN color = '2' THEN '黒'
ELSE 'その他' END
単純CASEでできることは検索CASEでもできる。
CASE式を使う時の注意点
- 真になるWHEN句は無視されるため、排他的に記述する方がいい。
- 全ての分岐でCASE式の返すデータ型が一致している必要がある。
- ENDの書き忘れに注意する。
- ELSE句は必ず書く。
→ELSE句はオプションであり記述しなければ「ELSE NULL」になるが、「エラーにならないが結果が違う」というバグの温床になりやすいから。 - CASE式自体には集積機能がないため、レコードを集積するためには集積関数が必要。
異なる条件の集積をCASE式を使って1つのSQLで行う
異なる条件の集積という言葉に「?」となったが、2軸を持ったテーブルということで理解。
例えば、AグループとBグループで黒白赤から好きな色のアンケートを取った結果が以下のようなテーブルだとする。
color | a_or_b_group | num_of_people |
---|---|---|
white | a | 60 |
white | b | 40 |
black | a | 100 |
black | b | 100 |
red | a | 100 |
red | b | 50 |
このテーブルから色別・グループ別の人数を求める場合、
次のようなコードだと1つのSQLで集積を行うことができる。
1軸から2軸のテーブルにし、検索CASE式を用いる。
SELECT color,
SUM(CASE WHEN a_or_b_group = 'a' THEN num_of_people ELSE 0 END) AS a_group,
SUM(CASE WHEN a_or_b_group = 'b' THEN num_of_people ELSE 0 END) AS b_group
FROM colorTbl
GROUP BY color;
こんな感じで書いているコードを最初に見た時、
合計を出しているわけじゃないからSUMいらないのでは…?と思ったが、
SUMを入れないと集約されずに同じ数のレコード数が結果として出されてしまう。
上記コードを実行すると、以下のテーブルが結果として出力される。
color | a_group | b_group |
---|---|---|
red | 100 | 50 |
black | 100 | 100 |
white | 60 | 40 |
これで完了。
すっきりしたテーブルになった。
参考本
達人に学ぶSQL徹底指南書第2版