はじめに
CASE
式は、SQL-92で標準に取り入れられました。比較的新しい道具であるためか、便利なわりにその真価があまり知られておらず、利用されていなかったり、CASE
式の簡略版であるDECODE
(Oracle)、IF
(MySQL)などの関数で代用されていたりします。
しかし、ジョー・セルコが『プログラマのためのSQL 第2版』の中で、
SQL-92で追加された中で最も有用かもしれません
と言うように(注1)、CASE
式を活用するとSQLでできることの幅がぐっと広がり、書き方もスマートになります。しかも、実装非依存の技術なのでコードの汎用性も高まります。特にDECODE
関数を使っているOracleユーザーには、ぜひCASE
式への乗り換えをお薦めします。
このテキストは、そんないいこといっぱいのCASE
式の便利な使い方を紹介するものです。
私は同書から、
CASE
式に限らず、SQLとデータベースについて多くのことを学びました。このテキストは詰まるところ、この本のへの入門ないしは解説として書かれたものです。未読の方には、一読をお薦めします。必要な環境
次のいずれかのデータベース(MS Accessは対象外)。
- Oracle(9i以降)
- SQL Server
- DB2
- PostgreSQL
- MySQL
対象読者
入門者~中級者。
導入:CASE式とは
まず、基本的な文法から解説しましょう。CASE
式の書式には、単純CASE式(simple case)と検索CASE式(searched case)の2通りあります。それぞれ、次のように書きます。
--単純CASE式 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE 'その他' END --検索CASE式 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE 'その他' END
この2つは、どちらも同じ動作をします。「性別(sex
)」列が'1'
なら「男」へ、'2'
なら「女」へ読み替えているわけです。単純CASE
式の方が、その名の通り簡潔に書けますが、できることも限られています。単純CASE
式で書ける条件は、検索CASE
式でも書くことができるので、本稿では、検索CASE
式の方を多用します。
また、CASE
式の評価は、真になるWHEN
句が見つかった時点で打ち切られて、残りのWHEN
句は無視されるので、そのことを意識してコーディングする必要があります。無用の混乱を避けるためにも WHEN
句は排他的に記述するのが良いでしょう。
--例えば、こんなふうに書くと、結果には「2番」が現れない CASE WHEN col_1 IN ('a', 'b') THEN '1番' WHEN col_1 IN ('a') THEN '2番' ELSE 'その他' END