2.17.1 CASE式の形式と規則
(1) 機能
条件付けられた値を指定します。
(2) 形式
CASE式::={探索CASE式|単純CASE式|CASE略式} 探索CASE式::=CASE {WHEN 探索条件 THEN{値式|NULL}}… 〔ELSE{値式|NULL}〕 END 単純CASE式::=CASE 値式 {WHEN 値式 THEN{値式|NULL}}… 〔ELSE {値式|NULL}〕 END CASE略式::={NULLIF(値式,値式)|COALESCE(値式〔,値式〕…)}
(3) 規則
-
一つのCASE式中でWHENは255個まで指定できます。
-
CASE式の幾つかの探索条件が真であれば,CASE式の値はCASE式のデータ型に変換された,探索条件が真となる最初のWHENの結果の値となります。
-
CASE式のどの探索条件も真でなければCASE式の値はCASE式のデータ型に変換された,想定されるか,又は指定されるELSEの結果の値となります。
-
探索条件については「探索条件」を参照してください。
-
CASE式の結果のデータ型,及びデータ長は,集合演算のデータ型,及びデータ長と同じです。
-
CASE式の結果のデータ型は,非ナル値制約なし(ナル値を許す)になります。
-
CASE式の結果のデータ型が文字データ型の場合,結果の文字集合は次の表に示すとおりになります。
表2‒105 CASE式の結果の文字集合 CASE式
結果の文字集合
探索CASE式
先頭のTHENに指定した値式の文字集合
単純CASE式
先頭のTHENに指定した値式の文字集合
CASE略式
NULLIF
最初の値式の文字集合
COALESCE
最初の値式の文字集合
-
COALESCEの場合,値式の並びは左から右に順に評価され,ナル値でない最初の値が結果になります。
-
CASE中の少なくとも一つのTHENは,値式を指定してください。
-
CASE,THEN,及びELSEの値式に,?パラメタ,及び埋込み変数を単独(単項演算式に指定した場合も含む)で指定できません。
-
ELSEが指定されていない場合は,ELSE NULLが仮定されます。
-
CASE 値式,WHEN 値式,NULLIF及びCOALESCEの値式には,次に示すデータ型の値を指定できません。
-
BLOB
-
定義長が32,001バイト以上のBINARY
-
BOOLEAN
-
抽象データ型
-
-
THEN及びELSEの値式には,次に示すデータ型の値を指定できません。
-
BLOB
-
定義長が32,001バイト以上のBINARY
-
BOOLEAN
-
抽象データ型
-
-
THEN及びELSEに指定した値式が文字データ型の場合,値式の文字集合はすべて同じにしてください。ただし,二つ目以降のTHEN,又はELSEに指定した値式が次に示す値式の場合,先頭のTHENに指定した値式の文字集合に変換されます。
-
文字列定数
-
-
単純CASE式は,WHENの値式であるV1とCASEの値式であるV2を,V2=V1の型で探索条件に指定した探索CASE式と同じです。
-
単純CASE指定中の最初のWHENの値式,COALESCEの最初の値式,又はNULLIFの両方の値式に,?パラメタ,及び埋込み変数は単独(単項演算式に指定した場合も含む)で指定できません。
-
単純CASE式の一つ以上のWHENの値式が?パラメタ,又は埋込み変数の場合,?パラメタ,又は埋込み変数のデータ型は,最初のWHENの値式のデータ型を仮定します。
-
NULLIFの一つの値式が?パラメタ,又は埋込み変数の場合,?パラメタ,又は埋込み変数のデータ型は,もう一方の値式のデータ型を仮定します。
-
COALESCEの一つ以上の値式が?パラメタ,又は埋込み変数の場合,?パラメタ,又は埋込み変数のデータ型は,最初の値式のデータ型を仮定します。
-
COALESCEの値式は255個まで指定できます。
-
NULLIF(V1,V2)は,次に示すのCASE式と同じです。
CASE WHEN V1=V2 THEN NULL ELSE V1 END
-
COALESCE(V1,V2)は,次に示すスカラ関数VALUE,又はCASE式と同じです。
VALUE(V1,V2)
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
-
nが三つ以上のCOALESCE(V1,V2,…,Vn)は,次に示すスカラ関数VALUE,又はCASE式と同じです。
VALUE(V1,V2,…,Vn)
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE(V2,…,Vn) END
-
探索CASE式,単純CASE式のTHEN,及びELSEの値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし,次に示すデータは比較できません。
-
日付データと日付データの文字列表現
-
時刻データと時刻データの文字列表現
-
時刻印データと時刻印データの文字列表現
-
日間隔データと日間隔データの10進数表現
-
時間隔データと時間隔データの10進数表現
-
バイナリデータと16進文字列定数
-
-
単純CASE式の場合,WHENの値式のデータ型とCASEの値式のデータ型は比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし,次に示すデータは比較できません。
-
日付データと日付データの文字列表現
-
時刻データと時刻データの文字列表現
-
時刻印データと時刻印データの文字列表現
-
日間隔データと日間隔データの10進数表現
-
時間隔データと時間隔データの10進数表現
-
バイナリデータと16進文字列定数
-
-
単純CASE式でCASE値式とWHENの値式が文字列型の場合,CASE値式とWHENの値式の文字集合は同じにしてください。ただし,WHENの値式が次に示す値式である場合,CASE値式の文字集合に変換して比較を行います。
-
文字列定数
-
-
NULLIF,COALESCEの場合,値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし,次に示すデータは比較できません。
-
日付データと日付データの文字列表現
-
時刻データと時刻データの文字列表現
-
時刻印データと時刻印データの文字列表現
-
日間隔データと日間隔データの10進数表現
-
時間隔データと時間隔データの10進数表現
-
バイナリデータと16進文字列定数
-
-
NULLIFで,値式が両方とも文字列データ型の場合,二つの値式の文字集合は同じにしてください。ただし,値式のどちらかが次に示す値式である場合,もう一方の値式の文字集合に変換します。
-
文字列定数
-
-
COALESCEで,値式が両方とも文字列データ型の場合,二つの値式の文字集合は同じにしてください。ただし,二番目の値式が次に示す値式である場合,一番目の値式の文字集合に変換します。
-
文字列定数
-
-
繰返し列は,添字を指定すればCASE式中に指定できます。また,CASE式の探索条件の繰返し列には添字としてANYを指定でき,IS NULL述語には添字なし繰返し列を指定できます(指定できる箇所は,探索条件と同じです)。ただし,選択式に指定したCASE式中の繰返し列には,添字としてANYは指定できません。
-
予備列は指定できません。
-
ウィンドウ関数は指定できません。
(4) 使用例
(a) 探索CASE式の場合
表T1のうち,C1列が'AA'のものを'AAA',C1列が'BB'のものを'BBB'に更新します。
UPDATE T1 SET C1 = CASE WHEN C1='AA' THEN 'AAA' WHEN C1='BB' THEN 'BBB' ELSE C1 END
(b) 単純CASE式の場合
表T1のうち,C1列が'AA'のものを'AAA',C1列が'BB'のものを'BBB'に更新します。
UPDATE T1 SET C1 = CASE C1 WHEN 'AA' THEN 'AAA' WHEN 'BB' THEN 'BBB' ELSE C1 END
(c) CASE略式(COALESCE)の場合
表T1の列C1,C2,C3の順で,ナル値でない列を抽出します。すべてがナル値の場合,結果として0が設定されます。
SELECT COALESCE(C1,C2,C3,0)FROM T1
(d) CASE略式(NULLIF)の場合
表T1の列C1,C2の値等しい場合,結果としてナル値を返します。列C1,C2の値が等しくない場合,列C1を抽出します。
SELECT NULLIF(C1,C2) FROM T1