Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.29.1 CASE式の指定形式および規則

指定した探索条件に該当する場合,指定した値式の結果を返します。

〈この項の構成〉

(1) 指定形式

CASE式::=
     CASE
        {WHEN 探索条件 THEN {値式|NULL}}…
        〔ELSE {値式|NULL}〕
     END

(2) 指定形式の説明

WHEN 探索条件

探索条件を指定します。探索条件については「7.18 探索条件」を参照してください。指定した探索条件に該当した場合,THEN以降に指定した値が結果として返ります。

なお,1つのCASE式中にWHENを255個まで指定できます。

THEN 値式|NULL}

指定した探索条件に該当する場合に,結果として返す値を値式の形式で指定します。ナル値を返したい場合は,NULLを指定します。

ELSE 値式|NULL}

WHENで指定したすべての探索条件に該当しなかった場合に,結果として返す値を値式の形式で指定します。ナル値を返したい場合は,NULLを指定します。

ELSEの指定を省略した場合,ELSEにはNULLが指定されたと仮定されます。

(3) 規則

  1. CASE式中にWHENを複数指定し,2つ以上の探索条件が真となった場合,探索条件が真となった最初のWHENの結果がCASE式の結果となります。

  2. THENおよびELSEに指定する値式の結果のデータ型は,比較できるデータ型にしてください。比較できるデータ型については,「6.2.2 変換,代入,比較できるデータ型」の「(1) 比較できるデータ型」を参照してください。

    ただし,次のデータ型は比較できません。

    • 日付データと文字データ(日付を表す既定の入力表現)

    • 時刻データと文字データ(時刻を表す既定の入力表現)

    • 時刻印データと文字データ(時刻印を表す既定の入力表現)

    既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。

  3. CASE式の結果のデータ型およびデータ長は,THENおよびELSEに指定した各値式の結果のデータ型およびデータ長によって決まります。詳細については,「7.20.2 値式の結果のデータ型」を参照してください。

  4. THENまたはELSEに,少なくとも1つは値式を指定してください。次のようにすべての値式にNULLを指定することはできません。

    (例)

      CASE
          WHEN "C1"=100 THEN NULL
          ELSE NULL
      END
  5. CASETHEN,およびELSEに指定する値式に,?パラメタを単独で指定できません。

  6. THENおよびELSEの値式には,配列データを指定できません。

  7. CASE式の結果のデータ型は,非ナル値制約なし(ナル値を許す)になります。

(4) 例題

例題1

次に示すように表T1の検索を行います。

  • C1列が200の場合:C2列に20を加算した値を検索結果とする

  • C1列が100の場合:C2列に10を加算した値を検索結果とする

  • C1列が100および200以外の値の場合:C2列に5を加算した値を検索結果とする

SELECT "C1","C2",CASE WHEN "C1"=200 THEN "C2"+20
                      WHEN "C1"=100 THEN "C2"+10
                      ELSE "C2"+5
                 END AS "CASE"
    FROM "T1"

[図データ]

例題2

社員表(EMPLIST)を検索して次に示す値を求めます。

  • 部署コード(SCODE)ごとに,所属する男性と女性の人数を求める

SELECT "SCODE",SUM(CASE WHEN "SEX"='M' THEN 1 ELSE 0 END) AS "Men",
        SUM(CASE WHEN "SEX"='F' THEN 1 ELSE 0 END) AS "Women"
    FROM "EMPLIST"
    GROUP BY "SCODE"

[図データ]

例題3

新商品表(PRODUCTLIST_NEW)に,商品表(PRODUCTLIST)の行を挿入します。行を挿入する際,商品価格(PRICE)を次に示すように新価格に変更します。

  • 商品コード(PCODE)がP001の場合:商品価格を10%引きにする

  • 商品コードがP002の場合:商品価格を20%引きにする

  • 上記以外の場合:商品価格を30%引きにする

INSERT INTO "PRODUCTLIST_NEW"("PCODE","PRICE")
    SELECT "PCODE",CASE WHEN "PCODE"='P001' THEN "PRICE"*0.9
                        WHEN "PCODE"='P002' THEN "PRICE"*0.8
                        ELSE "PRICE"*0.7
                   END
    FROM "PRODUCTLIST"

[図データ]