NVL函数误区

来源:互联网 发布:struct node *link,*p 编辑:程序博客网 时间:2024/06/07 00:04
在一开始个人一直认为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的类型

0 0