CASE 式

CASE 式は、1 つ以上の条件の評価に基づいて式を選択するためのものです。

case-expression
Read syntax diagramSkip visual syntax diagramCASEsearched-when-clausesimple-when-clauseELSE NULLELSEresult-expressionEND1
searched-when-clause
Read syntax diagramSkip visual syntax diagramWHENsearch-conditionTHENresult-expressionNULL
simple-when-clause
Read syntax diagramSkip visual syntax diagramexpression WHENexpressionTHENresult-expressionNULL
Notes:
  • 1 If the result type of result-expression is a row type, then the syntax represents a row-case-expression and can only be used where a row-expression is allowed.

一般に、case-expression の値は、評価が「真」である最初の (左端の) ケースの後に来る result-expression (結果式) の値になります。 評価が「真」であるケースがなく、ELSE キーワードが指定されている場合、 結果は ELSE の result-expression (結果式) または NULL になります。 評価が「真」であるケースがなく、ELSE キーワードが指定されていない場合、 結果は NULL になります。 あるケースの評価が「不明」の場合 (NULL のため)、そのケースは「真」ではなく、 したがって評価が「偽」であるケースと同じように扱われます。

CASE 式が VALUES 節、IN 述部、GROUP BY 節、または ORDER BY 節中にある場合、 searched-when-clausesearch-condition は、比較述部、全選択を使用する IN 述部、または EXISTS 述部にすることはできません (SQLSTATE 42625)。

simple-when-clause (単純 WHEN 節) を使用する場合は、 最初の WHEN キーワードの前の expression (式) の値が、 その WHEN キーワードの後にある expression の値と等しいかどうかが検査されます。 このため、最初の WHEN キーワードの前の expression は、 WHEN キーワードの後に来るそれぞれの expression のデータ・タイプと互換である必要があります。 simple-when-clause 内の最初の WHEN キーワードの前にある で、 決定論的でない関数または外部処理を伴う関数を使用することはできません (SQLSTATE 42845)。

result-expression (結果式) は、 THEN または ELSE キーワードの後に指定する です。 CASE 式では、少なくとも 1 つの result-expression を指定する必要があります (すべてのケースに NULL を指定することはできません) (SQLSTATE 42625)。 すべての結果式のデータ・タイプは互換でなければなりません (SQLSTATE 42804)。

  • 以下の例では、部門番号の先頭文字が組織内の部を示すものとし、 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 ステートメントの別の有効な使い方として、 ゼロ除算によるエラーを防止することができます。 例えば以下のコードは、 収入のすべてではないが 25% より多くを歩合で得ている社員を検索しています。
       SELECT EMPNO, WORKDEPT, SALARY+COMM FROM EMPLOYEE
       WHERE (CASE WHEN SALARY=0 THEN NULL
         ELSE COMM/SALARY
         END) > 0.25;
  • 以下の 2 つの CASE 式は同じものです。
       SELECT LASTNAME,
         CASE
         WHEN LASTNAME = 'Haas' THEN 'President'
         ...
    
       SELECT LASTNAME,
         CASE LASTNAME
         WHEN 'Haas' THEN 'President'
         ...

CASE の機能の一部を処理する目的で、 スカラー関数の NULLIF と COALESCE が特別に用意されています。 表 1 は、 CASE またはこれらの関数を使用した同等の式を示しています。

表 1. 同等の 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
  WHEN c1=var1 OR (c1 IS NULL AND var1 IS NULL)
    THEN 'a'
  WHEN c1=var2 OR (c1 IS NULL AND var2 IS NULL)
    THEN 'b'
  ELSE NULL
END
DECODE (c1,var1, 'a ', var2, 'b')