【oracle】DECODE ,NVL,NVL2的用法
Decode
DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value 等於if1時,DECODE函式的結果返回then1,...,如果不等於任何一個if值,則返回else。初看一下,DECODE 只能做等於測試,但剛才也看到了,我們通過一些函式或計算替代value,是可以使DECODE函式具備大於、小於或等於功能。
NVL
1.NVL ( )語法:nvl(expr1,expr2)
如果 expr1 是 null 值,則 nvl 函式返回 expr2 ,否則就返回 expr1 。
說明:引數 expr1、expr2 可以是任何資料型別,但應該保持相同。若兩者資料型別不一致,則Oracle資料庫會隱式的轉換其中一個的資料型別使其保持和另一個一致,若無法轉換則會返回錯誤。隱式轉換的實施規則如下:
(1)若 expr1 是字元資料,則Oracle資料庫在比較之前就會把 expr2 轉換成 expr1 的資料型別並且返回 VARCHAR2 資料型別到 expr1 的字符集。
(2) 若 expr1 是數值型,則Oracle資料庫決定哪個引數具有最高數值優先順序,並把另一個引數的資料型別隱式轉換成這種資料型別,並返回這種資料型別的資料。
例項:返回員工姓名和獎金,若該員工沒有獎金則返回 Not Applicable
SELECT last_name, NVL(TO_CHAR(commission_pct), 'Not Applicable') "COMMISSION"
FROM employees
WHERE last_name LIKE 'B%'
ORDER BY last_name;
NVL2
語法:nvl2(expr1,expr2,expr3)
如果 expr1 不是 null 值,則 nvl 函式返回 expr2 ,否則就返回 expr3 。引數可以返回任何資料型別的值,但是 expr2 和 expr3 不能是 LONG 型的資料型別。
說明:若 expr2 和 expr3 的資料型別不同:
(1)若 expr2 是字元資料,則Oracle資料庫在比較之前就會把 expr3 轉換成 expr2 的資料型別除非 expr3 是null。在 這種情況下,隱式資料轉換是不必要的。Oracle資料庫返回 VARCHAR2 資料型別到 expr2 的字符集。
(2) 若 expr2 是數值型,則Oracle資料庫決定哪個引數具有最高數值優先順序,並把另一個引數的資料型別隱式轉換成這種資料型別,並返回這種資料型別的資料。
例項:返回員工收入,看員工收入(income)是否由工資(salary)加獎金(commission)組成,這取決於commission_pct列是否為null
SELECT last_name, salary, NVL2(commission_pct, salary + (salary * commission_pct), salary) income FROM employees
WHERE last_name like 'B%'
ORDER BY last_name;