SQL の CASE 式って知ってますか?

今日、同僚から MySQL って CASE 式を SQL の中に記述できましたっけ?と聞かれて、SQL 文に CASE - when 式を記述できることを初めて知りました。PL/SQL でのみ有効な構文かと勘違いしてました。
 
CASE 式はSQL-92 で標準に取り入れられており、意外と歴史は古いです。SQL99 からかと思いました。しかしながら、超便利な CASE 式を知っている人は意外と少ないと思います。Oracle なら同様の処理が記述できる DECODE 関数の方がメジャーですね。実際僕もこちらを用いて業務 SQL を書いてました。

- スポンサーリンク -

しかし実際のところ、CASE 式の方が明らかに高機能でした。DECODE 関数を使っているOracleユーザには、是非CASE 式への乗り換えを勧めます。CASE 式には下記の通り4つの利用方法があります。

  • 既存のコード体系を新しい体系に変換する(DECODE 関数の変わり)
    SELECT count(*),
      CASE code WHEN 'M' THEN '男性' WHEN 'F' THEN '女性' ELSE 'オカマ?' END
    FROM table1 GROUP BY code;
  • 異なる条件の集計を一つの SQL で行なう(DHW等で比正規化したテーブルに戻すときに便利)
    SELECT
     SUM( CASE WHEN code = 'M' THEN 1 ELSE 0 END ),  -- 男性の人数
     SUM( CASE WHEN code = 'F' THEN 1 ELSE 0 END )   -- 女性の人数
    FROM table1;
  • CHECK 制約で二つの列の相関関係を定義する
    CONSTRAINT check_salary  -- 平社員は給与が20万円以下という制約の例
     ( CASE WHEN code = '平社員' THEN 
       CASE WHEN salary <= 200000 THEN 1 ELSE 0 END
      ELSE 1 END
     )
  • UPDATE 文で CASE 式で条件分岐して更新する
    UPDATE 商品テーブル  -- 単価1万円以上の商品の販売価格を10%値引きする
     SET 販売価格 = CASE WHEN 単価 >= 100000 THEN 販売価格 * 0.9 ELSE 販売価格 END;
とまぁ、CASE 式は PL/SQL でしか無理かなぁ〜と思っていたことの多くを SQL 一つで実装できてしまいます。しかも速度も PL/SQL より高速です。今後は多用していこうと思いました。

ちなみに、同僚から借りた下記の本を電車の中で読んで、このCASE 式について詳しく知りました。それ以外の事は全部日常使っている技術だったので、DB 使いな僕的にはホットしたところでした・・・。
 
現場で使えるSQL―Oracle/SQL Server対応
小野 哲 藤本 亮
翔泳社 (2001/10)
売り上げランキング: 10,451
通常24時間以内に発送
- スポンサーリンク -