77家的会客2010

SQL の CASE 式って知ってますか
Weather:晴转阴,南风4-5级,(21~27)℃

今日、同僚から MySQL って CASE 式を SQL の中に記述できましたっけ?と聞かれて、SQL 文に CASE - when 式を記述できることを初めて知りました。PL/SQL でのみ有効な構文かと勘違いしてました。
 
CASE 式はSQL-92 で標準に取り入れられており、意外と歴史は古いです。SQL99 からかと思いました。しかしながら、超便利な CASE 式を知っている人は意外と少ないと思います。Oracle なら同様の処理が記述できる DECODE 関数の方がメJn6;ャーですね。実際僕もこちらを用いて業務 SQL を書いてました。
 
が、CASE 式の方が明らかに高機能でした。DECODE 関数を使っているOracleユーJn5;には、是非CASE 式への乗り換えを勧めます。CASE 式には下記の通り4つの利用方法があります。
 

  • 既存のコーJn10;体系を新しい体系に変換する(DECODE 関数の変わり)

    SELECT count(*),
      CASE code WHEN 'M' THEN '男性' WHEN 'F' THEN '女性' ELSE 'オカマ?' END
    FROM table1 GROUP BY code;


     
  • 異なる条件の集計を一つの SQL で行なう(DHW等で比正規化したテーJn19;ルに戻すときに便利)

    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 商品テーJn19;ル  -- 単価1万円以上の商品の販売価格を10%値引きする
     SET 販売価格 = CASE WHEN 単価 >= 100000 THEN 販売価格 * 0.9 ELSE 販売価格 END;


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

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

历史上的今天: [2005/07/07]Sybase数据库SQL查询
[2005/07/07]近来解决的BLOG问题

[SQL の CASE 式って知ってますか]的回复

cheng 于 2008-07-07 15:37:51 发表 | IP:123.108.209.*

神呀,柠檬,你这日本是自己写的,还是copy来的。。。。

好久不写日志,一写俺们还看不懂。

ZZZzzz 于 2008-07-07 15:50:33 发表 | IP:152.104.150.*

nippon 语不懂の说

柠檬园主 于 2008-07-07 17:45:06 发表 | IP:221.201.150.*

呃。。。复制过来的,虽然看得懂,但要我写,还是写不出这水平的。。。。

4#   大雾 于 2008-07-09 07:45:05 发表 | IP:123.120.205.*

打死大柠檬~~~~

5#   柠檬园主 于 2008-07-09 10:47:40 发表 | IP:221.201.145.*

好嘛好嘛,我明天就开始写正常日记。。。。。

6#   大雾 于 2008-07-10 12:38:02 发表 | IP:123.120.203.*

大柠檬给介绍下WII吧,我最近开始长草,天天恳求大毛成给我买一个玩~~~你也劝劝他吧:)

7#   TRACY 于 2008-07-10 19:30:31 发表 | IP:124.93.18.*

WII 好好玩....  劝毛成劝毛成....

8#   cheng 于 2008-07-11 12:36:02 发表 | IP:123.108.209.*

嗨,楼上的几位,你们不用劝了!

因为我决定买了。哈哈哈。。

9#   TRACY 于 2008-07-14 21:48:48 发表 | IP:124.93.19.*

买了好哇,我们去了北京到你们家玩儿...

10#   Tract 于 2008-07-14 22:39:31 发表 | IP:124.93.19.*

楼上是盗版。。。

11#   柠檬园主 于 2008-07-14 22:55:57 发表 | IP:124.93.18.*

我晕,又乱了。

Post a Comment~