SQL の CASE 式って知ってますか? :: Drk7jp:
今日、同僚から 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 = 1
    )
  • UPDATE 文で CASE 式で条件分岐して更新する
    UPDATE 商品テーブル  – 単価1万円以上の商品の販売価格を10%値引きする
    SET 販売価格 = CASE WHEN 単価 >= 100000 THEN 販売価格 * 0.9 ELSE 販売価格 END;

とまぁ、CASE 式は PL/SQL でしか無理かなぁ~と思っていたことの多くを SQL 一つで実装できてしまいます。しかも速度も PL/SQL より高速です。今後は多用していこうと思いました。

ちなみに、同僚から借りた下記の本を電車の中で読んで、このCASE 式について詳しく知りました。それ以外の事は全部日常使っている技術だったので、DB 使いな僕的にはホットしたところでした・・・。