CASE式
CASE 式により、1 つ以上の条件の評価に基づいて式を選択することができます。
一般に、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 またはこれらの関数を使用した同等の式を示しています。
| 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
