首先,关于null这个东西,他是自适应类型的,意思是他可以是任何类型的,如果他在一个varchar2列,那他就是v archar2类型,
在一个number列,那他就是number类型,这和‘’是不一样的,同样,null和空字符串,按照当前来说是一样的(我的oracle版本是11.2.0.4),但是和空格是不一样的。
1,null,空格,空字符串在oracle中的存储
要研究自断类型在oracle中的存储,首先需要了解一个函数,这个函数是dump
SQL> select dump(null),dump(' '),dump('') from dual;
DUMP DUMP('') DUMP
---- ---------------- ----
NULL Typ=96 Len=1: 32 NULL
可以发现,null,和空字符串,在oracle中存储的都是null但是空格,存储的是 Typ=96 Len=1:
null和空格可以如下区分
SQL> set null unknown
SQL> col n for a20
SQL> select null n from dual;
N
--------------------
unknown
在一个number列,那他就是number类型,这和‘’是不一样的,同样,null和空字符串,按照当前来说是一样的(我的oracle版本是11.2.0.4),但是和空格是不一样的。
1,null,空格,空字符串在oracle中的存储
要研究自断类型在oracle中的存储,首先需要了解一个函数,这个函数是dump
SQL> select dump(null),dump(' '),dump('') from dual;
DUMP DUMP('') DUMP
---- ---------------- ----
NULL Typ=96 Len=1: 32 NULL
可以发现,null,和空字符串,在oracle中存储的都是null但是空格,存储的是 Typ=96 Len=1:
null和空格可以如下区分
SQL> set null unknown
SQL> col n for a20
SQL> select null n from dual;
N
--------------------
unknown
SQL> select '' n from dual;
N
--------------------
unknown
N
--------------------
unknown
SQL> select ' ' n from dual;
N
--------------------
2,对于null的比较和运算
首先,对于null的比较,必须用is null 或is not null,不能用=和<>,测试如下:
SQL> select 1 from dual where ''=null;
no rows selected
SQL> select 1 from dual where null=null;
no rows selected
SQL> select 1 from dual where '' is null
2 ;
1
----------
1
SQL> select 1 from dual where null is null;
1
----------
1
SQL> select 1 from dual where null is '';
select 1 from dual where null is ''
*
ERROR at line 1:
ORA-00908: missing NULL keyword
SQL> select 1 from dual where '' is '';
select 1 from dual where '' is ''
*
ERROR at line 1:
ORA-00908: missing NULL keyword
可以发现,尽管可以 '' is null,却不能 null is '' ,is null 和is not null是整体,这也算是null和空字符串的一个区别吧
对null的任何预算 都是返回null,这是个常识,不多测试了。
SQL> select null-1 from dual;
NULL-1
----------
unknown
SQL> select 1-null from dual;
1-NULL
----------
unknown
3,因为null这个玩意很特殊,所以oracle设计了很多函数来对他进行处理,让他不能太得瑟。常用的有
nvl(expr1,exper2)如果expr1是null,就返回expr2
nvl2(expr1,export,expr3)如果expr1不是null就返回expr2,是null就返回expr3.
nullif(expr1,expr2)判断参数1和参数2是否相等,相等就返回null,不相等就返回参数1,但是nullif的参数类型必须一样,而且参数1不能为null,不然会报错的。同时,如果参数1是null,那么进行类型转换之后,转化为字符串或日期类型的null都不会报错,但是number不行。
对nullif稍微做一下测试
SQL> SELECT NULLIF(1,2) FROM DUAL;
NULLIF(1,2)
-----------
1
SQL> SELECT (1,NULL) FROM DUAL;
SELECT (1,NULL) FROM DUAL
*
ERROR at line 1:
ORA-00907: missing right parenthesis
SQL> SELECT NULLIF(1,NULL) FROM DUAL;
NULLIF(1,NULL)
--------------
1
SQL> SELECT NULLIF(NULL,1) FROM DUAL;
SELECT NULLIF(NULL,1) FROM DUAL
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got CHAR
SQL> select nullif(to_char(null),'1') n from dual;
N
--------------------
unknown
SQL> select nullif(1,'2') from dual;
select nullif(1,'2') from dual
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
SQL> select nullif(to_date(null),sysdate) from dual;
NULLIF(TO
---------
unknown
SQL> select nullif(to_number(null),1) n from dual;
select nullif(to_number(null),1) n from dual
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got NUMBER
coalesce(expr1,expr2,expr3,......exprn)从左到右返回第一个不是null的参数。但是所有参数必须为同一类型,这个很简单,测试过程就不贴了。
N
--------------------
2,对于null的比较和运算
首先,对于null的比较,必须用is null 或is not null,不能用=和<>,测试如下:
SQL> select 1 from dual where ''=null;
no rows selected
SQL> select 1 from dual where null=null;
no rows selected
SQL> select 1 from dual where '' is null
2 ;
1
----------
1
SQL> select 1 from dual where null is null;
1
----------
1
SQL> select 1 from dual where null is '';
select 1 from dual where null is ''
*
ERROR at line 1:
ORA-00908: missing NULL keyword
SQL> select 1 from dual where '' is '';
select 1 from dual where '' is ''
*
ERROR at line 1:
ORA-00908: missing NULL keyword
可以发现,尽管可以 '' is null,却不能 null is '' ,is null 和is not null是整体,这也算是null和空字符串的一个区别吧
对null的任何预算 都是返回null,这是个常识,不多测试了。
SQL> select null-1 from dual;
NULL-1
----------
unknown
SQL> select 1-null from dual;
1-NULL
----------
unknown
3,因为null这个玩意很特殊,所以oracle设计了很多函数来对他进行处理,让他不能太得瑟。常用的有
nvl(expr1,exper2)如果expr1是null,就返回expr2
nvl2(expr1,export,expr3)如果expr1不是null就返回expr2,是null就返回expr3.
nullif(expr1,expr2)判断参数1和参数2是否相等,相等就返回null,不相等就返回参数1,但是nullif的参数类型必须一样,而且参数1不能为null,不然会报错的。同时,如果参数1是null,那么进行类型转换之后,转化为字符串或日期类型的null都不会报错,但是number不行。
对nullif稍微做一下测试
SQL> SELECT NULLIF(1,2) FROM DUAL;
NULLIF(1,2)
-----------
1
SQL> SELECT (1,NULL) FROM DUAL;
SELECT (1,NULL) FROM DUAL
*
ERROR at line 1:
ORA-00907: missing right parenthesis
SQL> SELECT NULLIF(1,NULL) FROM DUAL;
NULLIF(1,NULL)
--------------
1
SQL> SELECT NULLIF(NULL,1) FROM DUAL;
SELECT NULLIF(NULL,1) FROM DUAL
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got CHAR
SQL> select nullif(to_char(null),'1') n from dual;
N
--------------------
unknown
SQL> select nullif(1,'2') from dual;
select nullif(1,'2') from dual
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
SQL> select nullif(to_date(null),sysdate) from dual;
NULLIF(TO
---------
unknown
SQL> select nullif(to_number(null),1) n from dual;
select nullif(to_number(null),1) n from dual
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got NUMBER
coalesce(expr1,expr2,expr3,......exprn)从左到右返回第一个不是null的参数。但是所有参数必须为同一类型,这个很简单,测试过程就不贴了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30123160/viewspace-2055747/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30123160/viewspace-2055747/
3972

被折叠的 条评论
为什么被折叠?



