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

Oracle DECODE 函數完整指南:語法、進階技巧與常見問題解答

     編輯:Oracle 資料庫基礎

語法結構

DECODE(expression, search1, result1, search2, result2, ..., default)
  • 相當於 IF-THEN-ELSIF-ELSE。
  • 最多 255 個參數(含 expression)。
  • 適用版本:Oracle 9i/10g/11g/12c/19c/21c。

基礎範例

SELECT supplier_name,
       DECODE(supplier_id, 10000, 'IBM',
                            10001, 'Microsoft',
                            10002, 'Hewlett Packard',
                                   'Gateway') AS result
  FROM suppliers;

進階技巧與常見問題

1. 比較兩個日期,取較小值

-- 利用日期相減特性
DECODE((date1 - date2) - ABS(date1 - date2), 0, date2, date1)

-- 更簡潔:配合 SIGN
DECODE(SIGN(date1 - date2), 1, date2, date1)

2. 數值區間分組

DECODE 無法直接判斷範圍,需轉換為離散值:

SELECT supplier_id,
       DECODE(TRUNC((supplier_id - 1) / 10),
              0, 'Category 1',
              1, 'Category 2',
              2, 'Category 3',
                     'Unknown') AS grp
  FROM suppliers;

公式 TRUNC((id-1)/10) 將 1-10→0、11-20→1、21-30→2...

3. 年資區間對應比率

SELECT emp_name,
       DECODE(TRUNC((yrs_of_service + 3) / 4),
              0, 0.04,
              1, 0.04,
                    0.06) AS perc_value
  FROM employees;

4. 綁定 SIGN 做紅利判斷

DECODE(SIGN(actual - target),
       -1, 'No Bonus',
        0, 'Just Made It',
        1, 'Congrats!')

注意事項

  • 參數超過 255 會報 ORA-00939,改用 CASE 表達式(無參數上限)。
  • 資料型別隱含轉換可能導致效能下降,建議明確 TO_CHAR/TO_NUMBER/TO_DATE。
  • 11g+ 推薦使用 CASE,可讀性更佳且支援複雜邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved