CASE 結構提供比 IF-THEN-ELSIF 更簡潔、效能更佳的多重條件處理方式。Oracle 支援兩種形式:簡單 CASE 表達式(等值比較)與 搜尋 CASE 表達式(條件比較),並可在 SQL 與 PL/SQL 中使用。
適用於同一運算式與多個離散值比較的場景。
CASE selector
WHEN value1 THEN result1
WHEN value2 THEN result2
...
[ELSE else_result]
END;
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM cip_temps;
CASE v_count
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE('WHEN 1 - v_count: ' || v_count);
WHEN 5 THEN
DBMS_OUTPUT.PUT_LINE('WHEN 5 - v_count: ' || v_count);
WHEN 10 THEN
DBMS_OUTPUT.PUT_LINE('WHEN 10 - v_count: ' || v_count);
ELSE
DBMS_OUTPUT.PUT_LINE('ELSE - v_count: ' || v_count);
END CASE;
END;
/
SELECT ename,
CASE deptno
WHEN 10 THEN 'ACCOUNTING'
WHEN 20 THEN 'RESEARCH'
WHEN 30 THEN 'SALES'
ELSE 'OTHER'
END AS department
FROM emp;
適用於範圍判斷、複合條件、非等值比較場景。
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
[ELSE else_result]
END;
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM cip_temps;
CASE
WHEN v_count > 10 THEN
DBMS_OUTPUT.PUT_LINE('>10 - v_count: ' || v_count);
WHEN v_count > 5 THEN
DBMS_OUTPUT.PUT_LINE('>5 - v_count: ' || v_count);
WHEN v_count > 4 THEN
DBMS_OUTPUT.PUT_LINE('>4 - v_count: ' || v_count);
ELSE
DBMS_OUTPUT.PUT_LINE('ELSE - v_count: ' || v_count);
END CASE;
END;
/
SELECT ename, sal,
CASE
WHEN sal >= 5000 THEN 'HIGH'
WHEN sal >= 3000 THEN 'MEDIUM'
WHEN sal >= 1500 THEN 'LOW'
ELSE 'ENTRY'
END AS salary_grade
FROM emp;
| 特性 | CASE 表達式 | CASE 語句 |
|---|---|---|
| 用途 | 回傳值,可用於 SQL SELECT/WHERE/PLSQL 運算式 | 控制流程,僅限 PL/SQL 區塊中執行動作 |
| 結尾 | END | END CASE; |
| THEN 後接 | 運算式/值 | 敘述句(可多行) |
NULL = NULL 為 FALSE,需額外 WHEN NULL THEN(搜尋 CASE 可用 WHEN selector IS NULL)