CASE 表示式
CASE 表示式容許根據一或多個條件的評估來選取表示式。
- 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 或這些函數的對等表示式。
| 表示式 | 對等表示式 |
|---|---|
|
NULLIF (e1,e2) |
|
聯合 (e1,e2) |
|
COALESCE (e1,e2,...,eN) |
|
DECODE (c1,var1, 'a ', var2, 'b') |
