SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

達人に学ぶSQL

CASE式のススメ(前編)

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


CHECK制約で複数の列の条件関係を定義する

 実は、というほどでもないのですが、CASE式はCHECK制約と非常に相性が良いのです。実際にCASE式を使う局面の半分は、CHECK制約の中ではないかと思うほどです。あまりCHECK制約を使わないDBエンジニアも多いかもしれませんが、CASE式と組み合わせたときの表現力の強さを知れば、きっとすぐに利用したくなるでしょう。

 例えば、ここに「女性社員の給料は20万円以下」という給与体系を持つ会社があるとします。この言語道断な会社の人事テーブルにおいて、この条件をCHECK制約で表現したのが次のSQLです。

サンプル5
CONSTRAINT check_salary CHECK
           ( CASE WHEN sex = '2'
                  THEN CASE WHEN salary <= 200000
                        THEN 1 ELSE 0 END
                  ELSE 1 END = 1 )

 CASE式を入れ子にして、「社員の性別が女性ならば、給料は20万円以下である」という命題を表現しています。これは命題論理で条件法(conditional)と呼ばれる論理式で、形式的に書けば「P → Q」となります。

 ここで一つ、重要なことを理解してください。それは、条件法と論理積(logical puroduct)との違いです。論理積とは「P かつ Q」を意味する論理式で形式的には「P ∧ Q」と書きます。CHECK制約で表現すると次のようになります。

サンプル6
CONSTRAINT check_salary CHECK
           ( sex = '2' AND salary <= 200000 )

 この2つの制約は、もちろん異なる動作をします。では、一体どのように異なるのでしょうか? 解答と解説を次にまとめます。

解答と解説

解答

 論理積のCHECK制約を付けると、この会社は男性を雇用できなくなる。条件法であれば、男性も働ける。

解説

 論理積「P ∧ Q」を満たす場合は、命題Pと命題Q が共に真か、どちらかが真でもう一方が不明である場合です。つまりこの会社で働けるのは「女性であり、かつ、給料が20万円以下」の社員か、性別または給料の値が不明の社員の場合です(どちらかの条件が偽になるなら、もう片方の条件が不明な人でも働けません)。

 一方、条件法「P ならば Q」を満たす場合は、PとQが共に真の場合と、Pが偽または不明な全ての場合です。

 以下に両者の真理表を示すので参考にしてください。なお、U は、SQLの3値論理に特有の真理値unknownの略です(3値論理については、私のWebサイト「3値論理」を参照してください)。

論理積と条件法
論理積 条件法
P Q P ∧ Q P Q P → Q
T T T T T T
T F F T F F
T U U T U F
F T F F T T
F F F F F T
F U F F U T
U T U U T T
U F F U F T
U U U U U T

 見てのとおり、条件法はそもそも社員の性別が女性でない(あるいは性別が分からない)場合は真となります。その意味で、論理積よりも緩い制約であると言えます。

まとめ

 今回は、CASE式の文法、および代表的な使い方を3通り紹介しました。コード体系の変換、集約関数との組み合わせ、CHECK制約との組み合わせ、いずれも非常に便利な使い道です。

 次回『CASE式のススメ(後編)』では、条件分岐させたUPDATE文の書き方、CASE式の中でサブクエリを使ったテーブル間のマッチング処理、そして CASE式の中で集約関数を使って HAVING句の条件設定を SELECT句で行なう方法という、より高度な使い方を紹介します。

修正履歴

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
達人に学ぶ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/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/404 2008/08/22 19:36

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー