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) 規則
-
CASE式中にWHENを複数指定し,2つ以上の探索条件が真となった場合,探索条件が真となった最初のWHENの結果がCASE式の結果となります。
-
THENおよびELSEに指定する値式の結果のデータ型は,比較できるデータ型にしてください。比較できるデータ型については,「6.2.2 変換,代入,比較できるデータ型」の「(1) 比較できるデータ型」を参照してください。
ただし,次のデータ型は比較できません。
-
日付データと文字データ(日付を表す既定の入力表現)
-
時刻データと文字データ(時刻を表す既定の入力表現)
-
時刻印データと文字データ(時刻印を表す既定の入力表現)
既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。
-
-
CASE式の結果のデータ型およびデータ長は,THENおよびELSEに指定した各値式の結果のデータ型およびデータ長によって決まります。詳細については,「7.20.2 値式の結果のデータ型」を参照してください。
-
THENまたはELSEに,少なくとも1つは値式を指定してください。次のようにすべての値式にNULLを指定することはできません。
(例)
CASE WHEN "C1"=100 THEN NULL ELSE NULL END
-
CASE,THEN,およびELSEに指定する値式に,?パラメタを単独で指定できません。
-
THENおよびELSEの値式には,配列データを指定できません。
-
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"
-