Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

CASE式のススメ(前編)

汎用度の高い条件式CASEの代表的な使い方

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/06/08 00:00

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2006/06/09 18:43 Page1 評価方法の例文のキャプション「WHERE句」を「WHEN句」に修正

著者プロフィール

  • ミック(ミック)

    主にOracleを使ったデータウェアハウス業務に従事するDBエンジニア。 HPのコンテンツ『リレーショナル・データベースの世界』。 著書: 『達人に学ぶ SQL徹底指南書』(翔泳社、2008) 訳書: ジョー・セルコ『SQLパズル 第2版』(翔泳社、2007) 講演資料:...

バックナンバー

連載:達人に学ぶSQL

もっと読む

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5