[每日一題] OCP1z0-047 :2013-08-29 NULL 正確答案:B 用函數可以針對各種數據類型時行操作,包括NULL值在內。其中有一類通用函數,是專門針對NULL值的。 1、針對NULL值的通用函數 (1)NVL(表達式1,表達式2): 轉換空值為一個實際值。如果表達式1值為空,NVL將返回表達式2的值作為結果。如果表達式1 不為空,以表達式1的值作為結果。 這個函數在有些時候非常有用,在很多應用程序中,都要把空當作0處理,這利用NVL是容易實現的:
[html] gyj@OCM> select name,salary,nvl(salary,0) from t1; NAME SALARY NVL(SALARY,0) ---------- ---------- ------------- gyj2 8000 8000 gyj3 10000 10000 gyj4 15000 15000 gyj8 0
2)NVL2 (表達式1,表達式2,表達式3) 此函數比NVL更復雜些。它首先判斷表達式1的值,如果表達式1非空,函數返回表達式2的值作為結果。如果表達式1 為空, 返回 表達式3的值為結果。表達式1 可以是任意數據類型、運算式子。 仍以上面的例子為准,將SAL列中為空的轉換成0,不為空的不變:
[html] gyj@OCM> select name,salary,nvl2(salary,salary,0) from t1; NAME SALARY NVL2(SALARY,SALARY,0) ---------- ---------- --------------------- gyj2 8000 8000 gyj3 10000 10000 gyj4 15000 15000 gyj8 0
(3)NULLIF(表達式1,表達式2) 比較兩個表達式,如果相等返回空;如果不相等,返回第一個表達式。 用它可以實現和上面例子中相反的效果。有些應用程序,要求把為0的值顯示為空:
[html] gyj@OCM> update t1 set salary=0 where id=5; 1 row updated. gyj@OCM> commit; Commit complete. gyj@OCM> select id,name,nullif(salary,0) from t1; ID NAME NULLIF(SALARY,0) ---------- ---------- ---------------- 2 gyj2 8000 3 gyj3 10000 4 gyj4 15000 5 gyj5 7 gyj7 12000
nullif(sal,0),就是將SAL為0的轉變為空。NVL和NVL2是將為空的轉變成其他不是空的值。 (4)COALESCE(表達式1,表達式2,表達式3,…………,表達式n) 返回表達式列表中的第一個值為非空的表達式的值。 它可以實現和NVL一樣的功能,而且它的功能比NVL強。如果用它來實現將NULL轉為0的操作,方法如下:
[html] gyj@OCM> select id,name,COALESCE(salary,0) from t1; ID NAME COALESCE(SALARY,0) ---------- ---------- ------------------ 2 gyj2 8000 3 gyj3 10000 4 gyj4 15000 5 gyj5 0 7 gyj7 12000