NVL函數誤區

在一開始個人一直認爲NVL(expr1, expr2)函數,只要expr1爲NULL就能,無論expr2是什麼類型的值都行。其實這樣想也是沒有錯的。但是,這樣還沒有看到這個函數的本質。其實NVL(expr1, expr2)這個函數中的expr1和expr2的值的類型是要一樣的如NVL(number, number)、NVL(char, char)、NVL(sysdate, sysdate)。

下面我們來看看例子並說明:

1、正常的例子

SQL> SELECT NVL(NULL, 'a') FROM dual;
N
-
a
2、當expr1是數字,而expr2是字符的時候,並且expr1的類型是不能隱式轉化爲expr2

SQL> SELECT NVL(1, 'a') FROM dual;
SELECT NVL(1, 'a') FROM dual
              *
ERROR at line 1:
ORA-01722: invalid number
由上面可以看出在expr1和expr2的類型不一樣是不行的
3、當expr1是數字,而expr2是字符的時候,並且expr1的類型能隱式轉化成expr2

SQL> SELECT NVL(1, '2') FROM dual;

NVL(1,'2')
----------
         1
由上面可以看出雖然expr1和expr2的類型不一樣,但是卻能執行成功。說明expr1的類型能隱式轉化成expr2就能執行。
4、當expr1是字符,而expr2是數字的時候

SQL> SELECT NVL('a', 2) FROM dual;

N
-
a
由上面能看出雖然expr1和expr2的類型不一樣,也不能發生隱式轉化卻能成功,可以看出他們隱式轉化的順序是,expr2要能隱式轉化成expr1。


總結:由上面可以總結出
1)、NULL可以是任何類型
2)、NVL(expr1, expr2)函數中expr1和expr2的類型要一樣
3)、NVL(expr1, expr2)函數中當expr1和expr2的類型不一樣時expr2的類型要能隱式轉換成expr1的類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章