CASE式

CASE 式により、1 つ以上の条件の評価に基づいて式を選択することができます。

構文図を読むビジュアル構文図をスキップCASE searched-when-clausesimple-when-clause ELSE NULLELSE結果式 END
searched-when-clause
構文図を読むビジュアル構文図をスキップWHEN検索条件THEN結果式NULL
simple-when-clause
構文図を読むビジュアル構文図をスキップ 検索条件 WHEN検索条件THEN結果式NULL

一般に、case 式 の値は、 真であると評価される最初の (左端の) when 文節 に続く結果式 の値です。 どの when 文節 も真であると評価されず、かつ ELSE キーワードが存在する場合は、 結果は ELSE 結果式 の値または NULL になります。 どの when 文節 も真であると評価せず、かつ ELSE キーワードが存在しない場合は、 結果は NULL になります。 when 文節 が不明 (NULL のため) と評価された場合は、 when 文節 は真ではなく、したがって、 偽であると評価される when 文節 と同じ方法で扱われます。

変更の開始検索条件または結果式の代わりに指定されている場合、EXISTSまたはINの述語に定量化された述語またはサブクエリを含めてはなりません。 変更の終わり

検索 WHEN 文節
評価のために提供される行または表データのグループのそれぞれに適用される 検索条件 と、 その条件が真の場合の結果を指定します。
単純 WHEN 文節
最初の WHEN キーワードの前にある expression 変更の開始または search-condition変更の終わり の値が、各 WHEN キーワードの後にある expression 変更の開始または search-condition変更の終わり の値と等しいかどうかをテストすることを指定します。 また、その条件が真の場合の結果も指定します。

最初の WHEN キーワードの前の expression 変更の開始または search-condition変更の終わり のデータ・タイプは、各 WHEN キーワードの後に続く expression 変更の開始または search-condition変更の終わり のデータ・タイプと互換性がなければなりません。

result-expression または NULL
THEN キーワードおよび ELSE キーワードに続く値を指定します。 CASE 式では、定義済みのデータ・タイプを持つ少なくとも 1 つの結果式 がなければなりません。 すべてのケースに NULL を指定することはできません

すべての result-expression は互換性のあるデータ・タイプでなければなりません。結果の属性は、 結果データ・タイプの規則に基づいて決定されます。

検索条件
行または表データのグループについて、真、偽、または不明の条件を指定します。

検索条件 には、EXISTS または IN 述部に副照会を組み込むことはできません。

CASE 式が、選択リスト、UPDATE または MERGE ステートメントの SET 節、または、 INSERT または MERGE ステートメントの VALUES 節に指定され、かつ、simple-when-clause または searched-when-clause が、 列アクセス制御がアクティブになっている列を参照している場合、 列値の代わりに、マスクされた値が使用されます。

CASE の持つ機能のサブセットを扱うように特化された 2 つのスカラー関数、NULLIF および COALESCE があります。 次の表は、CASE またはこれらの関数を使用した同等の式を示しています。

表 1. 同等の CASE 式
CASE 式 同等の式
CASE WHEN e1=e2 THEN NULL ELSE e1 END NULLIF(e1,e2)
CASE WHEN e1 IS NOT NULL THEN e1 ELSE e2 END COALESCE(e1,e2)
CASE WHEN e1 IS NOT NULL THEN e1 ELSE COALESCE(e2,...,eN) END COALESCE(e1,e2,...,eN)

  • 部門番号の先頭文字が組織上の部である場合には、CASE 式を使用して、それぞれの従業員が所属する部門の完全な名前をリストすることができます。
      SELECT EMPNO, LASTNAME,
        CASE SUBSTR(WORKDEPT,1,1)
        WHEN 'A' THEN 'Administration'
        WHEN 'B' THEN 'Human Resources'
        WHEN 'C' THEN 'Accounting'
        WHEN 'D' THEN 'Design'
        WHEN 'E' THEN 'Operations'
        END
      FROM EMPLOYEE
  • 教育年数が EMPLOYEE 表で使用されており、教育のレベルを示します。 CASE 式を使用して、これらをグループ化し、教育のレベルを示します。
      SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME,
        CASE
        WHEN EDLEVEL < 15 THEN 'SECONDARY'
        WHEN EDLEVEL < 19 THEN 'COLLEGE'
        ELSE 'POST GRADUATE'
        END
      FROM EMPLOYEE
  • CASE ステートメントを使用した別の興味ある例として、0 による割り算のエラーの保護があります。 例えば、次のコードでは、歩合で収入の 25% 以上を稼ぎながら、歩合の全額を支払われていない従業員を見つけだすものです。
      SELECT EMPNO, WORKDEPT, SALARY+COMM
      FROM EMPLOYEE
      WHERE (CASE WHEN SALARY=0 THEN NULL
                  ELSE COMM/SALARY
             END) > 0.25
     
  • 次の CASE 式は同等のものです。
      SELECT LASTNAME,
       CASE
       WHEN LASTNAME = 'Haas' THEN 'President'
       ...
       ELSE 'Unknown'
       END
      FROM EMPLOYEE
     
      SELECT LASTNAME,
       CASE LASTNAME
       WHEN 'Haas' THEN 'President'
       ...
       ELSE 'Unknown'
       END
      FROM EMPLOYEE