スケーラブルデータベースサーバ HiRDB Version 8 SQLリファレンス

[目次][索引][前へ][次へ]

2.17 CASE式

<この節の構成>
(1) 機能
(2) 形式
(3) 規則
(4) 使用例

(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. 探索条件については「2.7 探索条件」を参照してください。
  5. CASE式の結果のデータ型,及びデータ長は,集合演算のデータ型,及びデータ長と同じです。
  6. CASE式の結果のデータ型は,非ナル値制約なし(ナル値を許す)になります。
  7. CASE式の結果のデータ型が文字データ型の場合,結果の文字集合は次の表に示すとおりになります。

    表2-101 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の値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「1.2 データ型」を参照してください。ただし,次に示すデータは比較できません。
    • 日付データと日付データの文字列表現
    • 時刻データと時刻データの文字列表現
    • 時刻印データと時刻印データの文字列表現
    • 日間隔データと日間隔データの10進数表現
    • 時間隔データと時間隔データの10進数表現
    • バイナリデータと16進文字列定数
  25. 単純CASE式の場合,WHENの値式のデータ型とCASEの値式のデータ型は比較できるデータ型にしてください。比較できるデータ型については「1.2 データ型」を参照してください。ただし,次に示すデータは比較できません。
    • 日付データと日付データの文字列表現
    • 時刻データと時刻データの文字列表現
    • 時刻印データと時刻印データの文字列表現
    • 日間隔データと日間隔データの10進数表現
    • 時間隔データと時間隔データの10進数表現
    • バイナリデータと16進文字列定数
  26. 単純CASE式でCASE値式とWHENの値式が文字列型の場合,CASE値式とWHENの値式の文字集合は同じにしてください。ただし,WHENの値式が次に示す値式である場合,CASE値式の文字集合に変換して比較を行います。
    • 文字列定数
  27. NULLIF,COALESCEの場合,値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「1.2 データ型」を参照してください。ただし,次に示すデータは比較できません。
    • 日付データと日付データの文字列表現
    • 時刻データと時刻データの文字列表現
    • 時刻印データと時刻印データの文字列表現
    • 日間隔データと日間隔データの10進数表現
    • 時間隔データと時間隔データの10進数表現
    • バイナリデータと16進文字列定数
  28. NULLIFで,値式が両方とも文字列データ型の場合,二つの値式の文字集合は同じにしてください。ただし,値式のどちらかが次に示す値式である場合,もう一方の値式の文字集合に変換します。
    • 文字列定数
  29. COALESCEで,値式が両方とも文字列データ型の場合,二つの値式の文字集合は同じにしてください。ただし,二番目の値式が次に示す値式である場合,一番目の値式の文字集合に変換します。
    • 文字列定数
  30. 繰返し列は,添字を指定すればCASE式中に指定できます。また,CASE式の探索条件の繰返し列には添字としてANYを指定でき,IS NULL述語には添字なし繰返し列を指定できます(指定できる箇所は,探索条件と同じです)。ただし,選択式に指定したCASE式中の繰返し列には,添字としてANYは指定できません。
  31. ウィンドウ関数は指定できません。

(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
 

[図データ]