CASE式、DECODE関数とは
CASE式もDECODE関数もどちらも条件分岐をSQL内で記述するときに使用します。
どちらも条件分岐を記述したい時に使うならどっち使えばいいの?って気になると思います。
基本的には、「CASE式」が使用できるなら「CASE式」を使用することをおすすめします。理由は、「CASE式」は標準SQLで定められている機能ですし、「DECODE関数」でできることは、すべて「CASE式」で置き換え可能だからです。
それに比べて「DECODE関数」は、Oracle独自の関数になるので可読性でもDBMSの依存性という面でもCASE式に軍配が上がると考えています。
CASE式の構文
CASE式には、「単純CASE式」と「検索CASE式」の2種類があります。それぞれ構文を見ていきましょう。
単純CASE式 構文
CASE <式> WHEN <式> THEN <式> WHEN <式> THEN <式> ︙ ELSE <式> END
検索CASE式 構文
CASE WHEN <評価式> THEN <式> WHEN <評価式> THEN <式> ︙ ELSE <式> END
違いは構文を見ていただいてわかるとおり、単純CASE式ではある式の値を使って条件分岐していきます。検索CASE式は、評価式が個々に違うものを使って条件分岐していきます。
おまけ DECODE関数 構文
一応、DECODE関数の構文も。
DECODE(列名, 比較値, 結果1, 比較値2, 結果2, 結果3)
CASE式の実行例
CASE式の実行準備、テーブルとデータを用意します。以下のようなテーブルを使います。
id | name |
---|---|
1 | いるか |
2 | うさぎ |
3 | ぺんぎん |
--テーブル作成 CREATE TABLE zoo ( id VARCHAR2(10) ,name VARCHAR2(20) ) ; --データ作成 INSERT INTO zoo(id,name) VALUES ('1', 'いるか'); INSERT INTO zoo(id,name) VALUES ('2', 'うさぎ'); INSERT INTO zoo(id,name) VALUES ('3', 'ぺんぎん');
SQL> --テーブル作成 SQL> CREATE TABLE zoo 2 ( 3 id VARCHAR2(10) 4 ,name VARCHAR2(20) 5 ) 6 ; 表が作成されました。 SQL> --データ作成 SQL> INSERT INTO zoo(id,name) VALUES ('1', 'いるか'); 1行が作成されました。 SQL> INSERT INTO zoo(id,name) VALUES ('2', 'うさぎ'); 1行が作成されました。 SQL> INSERT INTO zoo(id,name) VALUES ('3', 'ぺんぎん'); 1行が作成されました。
単純CASEの実行例
SELECT id ,CASE name WHEN 'いるか' THEN '海の生き物' WHEN 'うさぎ' THEN '陸の生き物' ELSE '空の生き物' END as "どこの生き物?" FROM zoo ;
SQL> SELECT 2 id 3 ,CASE name 4 WHEN 'いるか' THEN '海の生き物' 5 WHEN 'うさぎ' THEN '陸の生き物' 6 ELSE '空の生き物' 7 END as "どこの生き物?" 8 FROM zoo 9 ; ID どこの生き物? ------------ ------------------------------ 1 海の生き物 2 陸の生き物 3 空の生き物
検索CASEの実行例
SELECT id ,CASE WHEN name = 'いるか' THEN '海の生き物' WHEN name = 'うさぎ' THEN '陸の生き物' ELSE '空の生き物' END as "どこの生き物?" FROM zoo ;
SQL> SELECT 2 id 3 ,CASE 4 WHEN name = 'いるか' THEN '海の生き物' 5 WHEN name = 'うさぎ' THEN '陸の生き物' 6 ELSE '空の生き物' 7 END as "どこの生き物?" 8 FROM zoo 9 ; ID どこの生き物? ------------ ------------------------------ 1 海の生き物 2 陸の生き物 3 空の生き物
おまけ DECODE関数の実行例
DECODE関数で上記と同様のSQLを提示します\(^o^)/冒頭でも書いたけどプロジェクトの規約的にそう書かないといけないという場合を除いて、あまりDECODE関数を使用するのはおすすめはしません。
SELECT id ,DECODE( name, 'いるか', '海の生き物' ,'うさぎ', '陸の生き物' ,'空の生き物') as "どこの生き物" FROM zoo ;
SQL> SELECT 2 id 3 ,DECODE( name, 'いるか', '海の生き物' ,'うさぎ', '陸の生き物' ,'空の生き物') as "どこの生き物?" 4 FROM zoo 5 ; ID どこの生き物? ------------ ------------------------------ 1 海の生き物 2 陸の生き物 3 空の生き物
コメント