首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle CASE WHEN 完整語法與四大應用場景實戰

     編輯:Oracle 教學

兩種基本語法形式

1. 簡單 CASE 表達式

CASE sex
  WHEN '1' THEN '男'
  WHEN '2' THEN '女'
  ELSE '其他'
END

2. 搜尋式 CASE 表達式

CASE
  WHEN sex = '1' THEN '男'
  WHEN sex = '2' THEN '女'
  ELSE '其他'
END

四大 SQL 子句應用場景

2.1 SELECT 子句:條件統計

SELECT grade,
       COUNT(CASE WHEN sex = 1 THEN 1 END) AS 男生數,
       COUNT(CASE WHEN sex = 2 THEN 1 END) AS 女生數
FROM students
GROUP BY grade;

利用 COUNT 忽略 NULL 特性,實現單次掃描多條件統計。

2.2 WHERE 子句:複雜條件邏輯

SELECT T2.*, T1.*
FROM T1, T2
WHERE (CASE
         WHEN T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%' THEN 1
         WHEN T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%' THEN 1
         ELSE 0
       END) = 1;

將多組 AND/OR 邏輯封裝為單一條件判斷,提升可讀性。

2.3 GROUP BY 子句:動態分組

SELECT
  CASE
    WHEN salary <= 500 THEN '1'
    WHEN salary > 500 AND salary <= 600 THEN '2'
    WHEN salary > 600 AND salary <= 800 THEN '3'
    WHEN salary > 800 AND salary <= 1000 THEN '4'
    ELSE NULL
  END AS salary_class,
  COUNT(*)
FROM Table_A
GROUP BY
  CASE
    WHEN salary <= 500 THEN '1'
    WHEN salary > 500 AND salary <= 600 THEN '2'
    WHEN salary > 600 AND salary <= 800 THEN '3'
    WHEN salary > 800 AND salary <= 1000 THEN '4'
    ELSE NULL
  END;

注意:GROUP BY 必須與 SELECT 中的 CASE 表達式完全一致,不可使用別名。

2.4 ORDER BY 子句:自訂排序

SELECT * FROM employees
ORDER BY
  CASE department_id
    WHEN 10 THEN 1
    WHEN 20 THEN 2
    WHEN 30 THEN 3
    ELSE 4
  END;

替代方案比較

3.1 DECODE 函數(Oracle 專有)

SELECT DECODE(sex, 'M', 'Male', 'F', 'Female', 'Unknown') FROM employees;

不支援 ANSI SQL,語法不如 CASE 直觀,不建議新專案使用。

3.2 WHERE 子句純邏輯改寫

WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%')
   OR (T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')

適用於簡單邏輯,複雜條件下易出錯,需謹慎驗證邏輯等價性。

最佳實踐建議

  • 優先使用搜尋式 CASE,彈性最高
  • ELSE NULL 可省略,但建議顯式寫出以示意圖
  • 嵌套 CASE 時注意縮排與可讀性
  • 效能上 CASE 表達式在單次掃描中計算,優於多次掃描或 UNION
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved