Oracle CASE式の使い方 DECODE関数の使い方

スポンサーリンク
スポンサーリンク

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式の実行準備、テーブルとデータを用意します。以下のようなテーブルを使います。

zooテーブル
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            空の生き物

コメント

タイトルとURLをコピーしました