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 式について詳しく知りました。それ以外の事は全部日常使っている技術だったので、DB 使いな僕的にはホットしたところでした・・・。
現場で使えるSQL―Oracle/SQL Server対応
posted with amazlet at 05.04.05
小野 哲 藤本 亮
翔泳社 (2001/10)
売り上げランキング: 10,451
通常24時間以内に発送
翔泳社 (2001/10)
売り上げランキング: 10,451
通常24時間以内に発送
- スポンサーリンク -
コメントやシェアをお願いします!
くず
一番下のUPDATE文のcaseはエラーになるので注意
case
もとネタはここでしょ。
http://www.geocities.jp/mickindex/database/db_case.html
明智重蔵
他にもこんな使い方もありますね
http://oraclesqlpuzzle.hp.infoseek.co.jp/2-2-7.html
http://oraclesqlpuzzle.hp.infoseek.co.jp/2-2-9.html
oraclesqlpuzzle
case式には
こんな使い方もありますよ
ttp://oraclesqlpuzzle.hp.infoseek.co.jp/2-2-1.html