集約関数の外でCASE式を使う
第3回では、
どういうことか、
SELECT dept,
COUNT(*) AS cnt
FROM Employees
GROUP BY dept;
dept cnt ----- ----- 人事 2 製造 3 会計 2 営業 5
これだけならごく単純な話なのですが、
凄いことに、
SELECT dept,
CASE WHEN COUNT(*) <= 2 THEN '2人以下'
ELSE '3人以上' END AS cnt
FROM Employees
GROUP BY dept;
dept cnt ----- ------- 人事 2人以下 製造 3人以上 会計 2人以下 営業 3人以上
最初にこのクエリを見たとき、
もっとも、
まとめ
手続き型言語においてIF文やCASE文といった条件分岐の機能が必須であるのと同様に、
それでは、
- 手続き型言語で表現可能なアルゴリズムは、
SQLにおいても表現可能である - その際に基本的な重要性を持つ道具が、
分岐とループ - SQLにおける分岐は、
CASE式を使って表現する。 「文パラダイム」 から 「式パラダイム」 への飛躍が理解の重要な鍵 - CASE式は、
見た目が 「文」 に見えがちだが、 実際は名前が示すとおり 「式」 であり、 文法的には通常の列や定数、 あるいは 「1 + 1」 のような式を記述しているのと変わらない - それゆえ、
SQLのほとんどどんなところにでも記述できる汎用性の高さが最大の魅力
SQLにおける分岐についてさらに深く学びたい方は、
- 『プログラマのためのSQL 第2版』
(J.セルコ 著、 ピアソン・ エデュケーション、 2001) セルコは、
米国データベース界の重鎮の一人で、 特に高度なSQLプログラミング技術の解説に手腕の冴えを見せます。 本書は、
中級SQLプログラミングをマスターするために必要な知識がすべて網羅された決定版の教科書です。ただし、 お世辞にもあまり読みやすくはありません。 「7. 1 CASE式」 は、 CASE式についての概念的な基礎から実際の応用例まで広くカバーする必読のテキストです。セルコもこのCASE式については 「SQLにとって最重要の機能である」 という破格の評価を与えています。 - 『達人に学ぶ SQL徹底指南書』
(ミック 著、 翔泳社、 2008) セルコの本は敷居が高くて…という方には、
手前味噌ですがこちらの拙著をお薦めします。脱初級~中級入門のレベルを噛み砕いて解説しています。 私は、
SQLを教える際は、 必ずCASE式の話を最初に配置するようにしています。本書も、 その例に漏れず、 筆頭に持ってきています (「1-1. CASE式のススメ」 参照)。WHEN句の中でEXISTSなどの述語と組み合わせたり、 入れ子のCASE式を使うなど、 本章で紹介しきれなかった重要なテクニックも紹介しています。