case-expression |--CASE----+-searched-when-clause-+-----------------------------> '-simple-when-clause---' .-ELSE NULL----------------. >-----+--------------------------+--END-------------------------| '-ELSE--result-expression--' searched-when-clause .-------------------------------------------------------. V | |------WHEN--search-condition--THEN--+-result-expression-+--+---| '-NULL--------------' simple-when-clause .-------------------------------------------------. V | |---expression-----WHEN--expression--THEN--+-result-expression-+--+-> '-NULL--------------' >---------------------------------------------------------------|
CASE 式は、1 つ以上の条件の評価に基づいて式を選択するためのものです。 一般に、CASE 式の値は、評価が「真」である最初の (左端の) ケースの後に来る result-expression (結果式) の値になります。 評価が「真」であるケースがなく、ELSE キーワードが指定されている場合、 結果は ELSE の result-expression (結果式) または NULL になります。 評価が「真」であるケースがなく、ELSE キーワードが指定されていない場合、 結果は NULL になります。 あるケースの評価が「不定」の場合 (NULL のため)、そのケースは「真」ではなく、 したがって評価が「偽」であるケースと同じように扱われます。
CASE 式が VALUES 文節、IN 述部、GROUP BY 文節、または ORDER BY 文節中にある場合、 searched-when-clause の search-condition は、 比較述部、全選択を使用する IN 述部、 または EXISTS 述部 (SQLSTATE 42625) にすることはできません。
simple-when-clause (単純 WHEN 文節) を使用する場合は、 最初の WHEN キーワードの前の expression (式) の値が、 その WHEN キーワードの後にある expression の値と等しいかどうかが検査されます。 このため、最初の WHEN キーワードの前の expression は、 WHEN キーワードの後に来るそれぞれの expression のデータ・タイプと互換である必要があります。 simple-when-clause の中の最初の WHEN キーワードの前にある expression に、 可変の関数または外部処理を伴う関数を含めることはできません (SQLSTATE 42845)。
result-expression (結果式) は、 THEN または ELSE キーワードの後に指定する式 です。 CASE 式では、少なくとも 1 つの結果式 を指定する必要があります (すべてのケースに NULL を指定することはできません) (SQLSTATE 42625)。 すべての結果式 のデータ・タイプは互換でなければならず (SQLSTATE 42804)、 結果の属性は 結果のデータ・タイプに関する規則に基づいて決定されます。
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;
SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, CASE WHEN EDLEVEL < 15 THEN 'SECONDARY' WHEN EDLEVEL < 19 THEN 'COLLEGE' ELSE 'POST GRADUATE' END FROM EMPLOYEE
SELECT EMPNO, WORKDEPT, SALARY+COMM FROM EMPLOYEE WHERE (CASE WHEN SALARY=0 THEN NULL ELSE COMM/SALARY END) > 0.25;
SELECT LASTNAME, CASE WHEN LASTNAME = 'Haas' THEN 'President' ...
SELECT LASTNAME, CASE LASTNAME WHEN 'Haas' THEN 'President' ...
CASE の機能の一部を処理する目的で、
スカラー関数の NULLIF と COALESCE が特別に用意されています。
表 11 に、
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) |