ダウンロード サンプルファイル (668.0 B)
SQL-92で標準に取り入れられたCASE式を用いると、今までCASE式の簡略版であるDECODE(Oracle)、IF(MySQL)などの関数で記述していたSQLを、実装非依存のコードに記述し直すことができ、コードの汎用性を高めることができます。今回は、コード体系の変換、集約関数との組み合わせ、CHECK制約との組み合わせの3通りの使い方を学びます。
はじめに
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
- 修正履歴
-
- 2006/06/09 18:43 Page1 評価方法の例文のキャプション「WHERE句」を「WHEN句」に修正
この記事は参考になりましたか?
- 達人に学ぶSQL連載記事一覧
- この記事の著者
-
ミック(ミック)
日本では、主にBI/DWHの設計からチューニングまでを専門とするデータベースエンジニアとして活動。2018年より米国シリコンバレーに活動拠点を移し、技術調査とビジネス開発に従事している。主な著書・訳書:『達人に学ぶSQL徹底指南書 第2版』(2018)『SQL実践入門』(2015)Joe Celko『プログラマのためのSQL 第4版』(2015)翔泳社 - 著者ページ:https://www.shoeisha.co.jp/book/author/3964著者個人ページ:http://mickindex.sakura.ne.jp/
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
