汎用度の高い条件式CASEの代表的な使い方
ミック [著] 2006/06/08 00:00

サンプルファイル 0.67 KB

SQL-92で標準に取り入れられたCASE式を用いると、今までCASE式の簡略版であるDECODE(Oracle)、IF(MySQL)などの関数で記述していたSQLを、実装非依存のコードに記述し直すことができ、コードの汎用性を高めることができます。今回は、コード体系の変換、集約関数との組み合わせ、CHECK制約との組み合わせの3通りの使い方を学びます。

1 2 3 →

はじめに

 CASE式は、SQL-92で標準に取り入れられました。比較的新しい道具であるためか、便利なわりにその真価があまり知られておらず、利用されていなかったり、CASE式の簡略版であるDECODE(Oracle)、IF(MySQL)などの関数で代用されていたりします。

 しかし、ジョー・セルコが『プログラマのためのSQL 第2版』の中で、

SQL-92で追加された中で最も有用かもしれません

 と言うように注1CASE式を活用するとSQLでできることの幅がぐっと広がり、書き方もスマートになります。しかも、実装非依存の技術なのでコードの汎用性も高まります。特にDECODE関数を使っているOracleユーザーには、ぜひCASE式への乗り換えをお薦めします。

 このテキストは、そんないいこといっぱいのCASE式の便利な使い方を紹介するものです。

『プログラマのためのSQL 第2版』
 この言葉は、『プログラマのためのSQL 第2版』(ジョー・セルコ著 ピアソン・エデュケーション 2001年刊)の117ページからの引用です。
 私は同書から、CASE式に限らず、SQLとデータベースについて多くのことを学びました。このテキストは詰まるところ、この本のへの入門ないしは解説として書かれたものです。未読の方には、一読をお薦めします。
 

必要な環境

 次のいずれかのデータベース(MS Accessは対象外)。

  • Oracle(9i以降)
  • SQL Server
  • DB2
  • PostgreSQL
  • MySQL

対象読者

 入門者~中級者。

導入:CASE式とは

 まず、基本的な文法から解説しましょう。CASE式の書式には、単純CASE式(simple case)と検索CASE式(searched case)の2通りあります。それぞれ、次のように書きます。

CASE式の書式
--単純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句は排他的に記述するのが良いでしょう。

残りのWHEN句が無視される記述例
--例えば、こんなふうに書くと、結果には「2番」が現れない
CASE WHEN col_1 IN ('a', 'b') THEN '1番'
     WHEN col_1 IN ('a')      THEN '2番'
ELSE 'その他' END

プロフィール
ミック ミック

主にOracleを使ったデータウェアハウス業務に従事するDBエンジニア。
HPのコンテンツ『リレーショナル・データベースの世界』。

著書:
達人に学ぶ SQL徹底指南書』(翔泳社、2008)

訳書:
ジョー・セルコ『SQLパズル 第2版』(翔泳社、2007)

講演資料:
「みんなまとめて面倒みよう」(デブサミ2008、2008/02/13)

『Web+DB Press』(Vol.44~)で「SQLアタマアカデミー」を連載中。


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト