CASE 表示式

CASE 表示式容許根據一或多個條件的評估來選取表示式。

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 的值是在評估為 true 的第一個 (最左) 觀察值之後的 result-expression 值。 如果沒有任何觀察值評估為 true ,且 ELSE 關鍵字存在,則結果是 result-expression 或 NULL 的值。 如果沒有任何觀察值評估為 true ,且 ELSE 關鍵字不存在,則結果為 NULL。 請注意,當觀察值評估為不明 (因為 NULLs) 時,該觀察值不是 true ,因此會被視為評估為 false 的觀察值。

如果 CASE 表示式位於 VALUES 子句、IN 述詞、GROUP BY 子句或 ORDER BY 子句中,則 search-when-clause 中的 search-condition 不能是量化述詞、使用全選的 IN 述詞或 EXISTS 述詞 (SQLSTATE 42625)。

使用 simple-when-clause時,會測試第一個 WHEN 關鍵字之前的 表示式 值是否與 WHEN 關鍵字之後的 表示式 值相等。 因此,第一個 WHEN 關鍵字之前 表示式 的資料類型必須與 WHEN 關鍵字之後每一個 表示式 的資料類型相當。 simple-when-clause 中第一個 WHEN 關鍵字之前的 表示式 不能包含 不確定 或具有外部動作 (SQLSTATE 42845) 的函數。

result-expression 是 THEN 或 ELSE 關鍵字後面的 表示式 。 CASE 表示式中必須至少有一個 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 陳述式用法的另一個有趣範例是保護免於除 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'
         ...
    
       SELECT LASTNAME,
         CASE LASTNAME
         WHEN 'Haas' THEN 'President'
         ...

有兩個純量函數 (NULLIF 和 COALESCE) 專門用來處理 CASE所提供功能的子集。 表 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
聯合 (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')