Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


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) 規則

  1. 一つのCASE式中でWHENは255個まで指定できます。

  2. CASE式の幾つかの探索条件が真であれば,CASE式の値はCASE式のデータ型に変換された,探索条件が真となる最初のWHENの結果の値となります。

  3. CASE式のどの探索条件も真でなければCASE式の値はCASE式のデータ型に変換された,想定されるか,又は指定されるELSEの結果の値となります。

  4. 探索条件については「探索条件」を参照してください。

  5. CASE式の結果のデータ型,及びデータ長は,集合演算のデータ型,及びデータ長と同じです。

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

  7. CASE式の結果のデータ型が文字データ型の場合,結果の文字集合は次の表に示すとおりになります。

    表2‒105 CASE式の結果の文字集合

    CASE式

    結果の文字集合

    探索CASE式

    先頭のTHENに指定した値式の文字集合

    単純CASE式

    先頭のTHENに指定した値式の文字集合

    CASE略式

    NULLIF

    最初の値式の文字集合

    COALESCE

    最初の値式の文字集合

  8. COALESCEの場合,値式の並びは左から右に順に評価され,ナル値でない最初の値が結果になります。

  9. CASE中の少なくとも一つのTHENは,値式を指定してください。

  10. CASE,THEN,及びELSEの値式に,?パラメタ,及び埋込み変数を単独(単項演算式に指定した場合も含む)で指定できません。

  11. ELSEが指定されていない場合は,ELSE NULLが仮定されます。

  12. CASE 値式,WHEN 値式,NULLIF及びCOALESCEの値式には,次に示すデータ型の値を指定できません。

    • BLOB

    • 定義長が32,001バイト以上のBINARY

    • BOOLEAN

    • 抽象データ型

  13. THEN及びELSEの値式には,次に示すデータ型の値を指定できません。

    • BLOB

    • 定義長が32,001バイト以上のBINARY

    • BOOLEAN

    • 抽象データ型

  14. THEN及びELSEに指定した値式が文字データ型の場合,値式の文字集合はすべて同じにしてください。ただし,二つ目以降のTHEN,又はELSEに指定した値式が次に示す値式の場合,先頭のTHENに指定した値式の文字集合に変換されます。

    • 文字列定数

  15. 単純CASE式は,WHENの値式であるV1とCASEの値式であるV2を,V2=V1の型で探索条件に指定した探索CASE式と同じです。

  16. 単純CASE指定中の最初のWHENの値式,COALESCEの最初の値式,又はNULLIFの両方の値式に,?パラメタ,及び埋込み変数は単独(単項演算式に指定した場合も含む)で指定できません。

  17. 単純CASE式の一つ以上のWHENの値式が?パラメタ,又は埋込み変数の場合,?パラメタ,又は埋込み変数のデータ型は,最初のWHENの値式のデータ型を仮定します。

  18. NULLIFの一つの値式が?パラメタ,又は埋込み変数の場合,?パラメタ,又は埋込み変数のデータ型は,もう一方の値式のデータ型を仮定します。

  19. COALESCEの一つ以上の値式が?パラメタ,又は埋込み変数の場合,?パラメタ,又は埋込み変数のデータ型は,最初の値式のデータ型を仮定します。

  20. COALESCEの値式は255個まで指定できます。

  21. NULLIF(V1,V2)は,次に示すのCASE式と同じです。

    CASE WHEN V1=V2 THEN NULL ELSE V1 END

  22. COALESCE(V1,V2)は,次に示すスカラ関数VALUE,又はCASE式と同じです。

    VALUE(V1,V2)

    CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

  23. nが三つ以上のCOALESCE(V1,V2,…,Vn)は,次に示すスカラ関数VALUE,又はCASE式と同じです。

    VALUE(V1,V2,…,Vn)

    CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE(V2,…,Vn) END

  24. 探索CASE式,単純CASE式のTHEN,及びELSEの値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし,次に示すデータは比較できません。

    • 日付データと日付データの文字列表現

    • 時刻データと時刻データの文字列表現

    • 時刻印データと時刻印データの文字列表現

    • 日間隔データと日間隔データの10進数表現

    • 時間隔データと時間隔データの10進数表現

    • バイナリデータと16進文字列定数

  25. 単純CASE式の場合,WHENの値式のデータ型とCASEの値式のデータ型は比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし,次に示すデータは比較できません。

    • 日付データと日付データの文字列表現

    • 時刻データと時刻データの文字列表現

    • 時刻印データと時刻印データの文字列表現

    • 日間隔データと日間隔データの10進数表現

    • 時間隔データと時間隔データの10進数表現

    • バイナリデータと16進文字列定数

  26. 単純CASE式でCASE値式とWHENの値式が文字列型の場合,CASE値式とWHENの値式の文字集合は同じにしてください。ただし,WHENの値式が次に示す値式である場合,CASE値式の文字集合に変換して比較を行います。

    • 文字列定数

  27. NULLIF,COALESCEの場合,値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし,次に示すデータは比較できません。

    • 日付データと日付データの文字列表現

    • 時刻データと時刻データの文字列表現

    • 時刻印データと時刻印データの文字列表現

    • 日間隔データと日間隔データの10進数表現

    • 時間隔データと時間隔データの10進数表現

    • バイナリデータと16進文字列定数

  28. NULLIFで,値式が両方とも文字列データ型の場合,二つの値式の文字集合は同じにしてください。ただし,値式のどちらかが次に示す値式である場合,もう一方の値式の文字集合に変換します。

    • 文字列定数

  29. COALESCEで,値式が両方とも文字列データ型の場合,二つの値式の文字集合は同じにしてください。ただし,二番目の値式が次に示す値式である場合,一番目の値式の文字集合に変換します。

    • 文字列定数

  30. 繰返し列は,添字を指定すればCASE式中に指定できます。また,CASE式の探索条件の繰返し列には添字としてANYを指定でき,IS NULL述語には添字なし繰返し列を指定できます(指定できる箇所は,探索条件と同じです)。ただし,選択式に指定したCASE式中の繰返し列には,添字としてANYは指定できません。

  31. 予備列は指定できません。

  32. ウィンドウ関数は指定できません。

(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

[図データ]