語法:DECODE(條件, 值1, 結果1, 值2, 結果2, ..., 預設值)
功能等同於程式語言中的 if...else if...else 邏輯。依序比較條件與各值,匹配則返回對應結果,無匹配返回預設值(可省略,預設為 NULL)。
語法:NVL(expr1, expr2)
expr1 為 NULL 時,返回 expr2expr1 非 NULL 時,返回 expr1注意:兩參數資料型別必須一致,否則需顯式轉換(如 TO_CHAR)。
範例:SELECT NVL(SUM(t.dwxhl), 1) FROM tb_jhde t — 若加總為 NULL 則返回 1。
語法:NVL2(expr1, expr2, expr3)
expr1 為 NULL → 返回 expr3expr1 非 NULL → 返回 expr2可視為 NVL 的擴展,提供「非 NULL 時」與「NULL 時」兩種不同返回值。
SELECT monthid, DECODE(NVL(sale, 6000), 6000, 'NG', 'OK') FROM output;
邏輯:sale 若為 NULL 則視為 6000,進而判斷是否等於 6000 返回 'NG',否則 'OK'。
SELECT monthid, DECODE(SIGN(sale - 6000), -1, sale, 6000) FROM output;
SIGN 返回:負數→-1、零→0、正數→1。當 sale < 6000 時 SIGN 為 -1,返回 sale;否則返回 6000。達到 LEAST(sale, 6000) 效果。
Oracle 9i+ 推薦使用 CASE 表達式替代 DECODE,可讀性更佳、支援複雜條件:
CASE
WHEN sale IS NULL THEN 'NG'
WHEN sale < 6000 THEN sale
ELSE 6000
END
| 函數 | 用途 | 參數數 | 典型場景 |
|---|---|---|---|
| NVL | NULL 替換 | 2 | 預設值填充、聚合函數 NULL 處理 |
| NVL2 | NULL/非 NULL 分支 | 3 | 條件分支、旗標轉換 |
| DECODE | 等值多重分支 | 可變 | 簡單值映射、類別轉換 |
| CASE | 通用條件分支 | 可變 | 複雜邏輯、範圍判斷、可讀性要求高 |