导航

对Oracle里NULL的理解

Posted on 2010-09-27 12:12  菜鸟都不容易  阅读(2834)  评论(2编辑  收藏  举报

 

1.在Oracle里,null是个相对独立的东西。它和所有非空的数据对立。对于字符串''来说,null既不等于'',也不不等于'';对于数值型来说,null既不等于0,也不不等于0;它不等于任何值,也不不等于任何值。也就是说null和所以其他的值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身,只能用is null,is not null比较。

2.如果使用带有其它比较操作符的条件表达式,并且其结果依赖于空值(如,在全量中找到某字段为空的所有记录,然后在此基础上再查找时,结果肯定为空。),那么其结果必定是NULL。在where条件中,Oracle认为结果为NULL的条件为FALSE,带有这样条件的select语句不返回行,也不返回错误信息。

3.往Oracle里插入''时,不会和sqlserver一样存入'',而是将这个字段设置为null,那么在查询这条记录的时候,如果查询'',则不会返回结果,条件里使用null才能找到。

【例子】解释第2条。

代码

create table T_XY
(
  FID  
NUMBER(2not null,
  VALD 
NUMBER(32)
)
tablespace DATATS
  pctfree 
10
  initrans 
1
  maxtrans 
255
  storage
  (
    initial 64K
    minextents 
1
    maxextents unlimited
  );

 

如上面的脚本建表,随便插入几条数据,要包括为空的记录才有效果。

执行select * from t_xy t,列出全部数据

执行select * from t_xy t where vald!=0 and vald is null,不返回记录,因为where条件依赖于null,则结果为null,整个where条件为false,select语句不返回行

执行select * from t_xy t where vald!=0 and vald is not null 返回不带空字段,并且vald!=0的记录因为where条件不依赖于null

执行select * from t_xy t where vald!=0 返回不带空字段,并且vald!=0的记录因为where条件不依赖于null,等同于上面的语句。(vald在和0比较的时候,Oracle自动排除掉空值字段,所     以可以不用加vald is not null条件。所以只要是满足vald!=0,则肯定是在not null的范围里相互比较,所以肯定查找不到is null的记录)