Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1272180
  • 博文数量: 185
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 3934
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-11 13:11
个人简介

iihero@ChinaUnix, ehero.[iihero] 数据库技术的痴迷爱好者. 您可以通过iihero AT qq.com联系到我 以下是我的三本图书: Sybase ASE in Action, Oracle Spatial及OCI高级编程, Java2网络协议内幕

文章分类

全部博文(185)

文章存档

2014年(4)

2013年(181)

分类: Oracle

2013-07-19 11:20:44

NULL,表示不明确、未知的列值

 

测试表:testnull(id varchar(32))

数据库:Sybase ASA11.0

行数据(''), (NULL)

 

数据库选项ansinull为true(也是ASA数据库的默认选项)时,

select * from testnull where id = null

select * from testnull where id != null

结果均为空

select * from testnull where id is null

结果为(NULL)

select * from testnull where id is not null

结果为('')

 

当ansinull为false时,

select * from testnull where id = null

结果为(NULL)

select * from testnull where id != null

结果为('')

 

从上述结果来看,NULL值确实是一个有争议的东西,但是,毫无疑问,ansinull对NULL的定义是精确的,即不能对NULL值进行等于或不等判断,无论是等还是不等,其结果都为false.

而统一的is null, is not null的含义则显然是明确的,NULL is null恒为真,非NULL is null恒为假。

 

再看看在Oracle中的结果:

SQL> select * from testnull where id is null;

ID
--------------------------------

 

SQL> select * from testnull where id is not null;

no rows selected

SQL> select * from testnull where id=null;

no rows selected

SQL> select * from testnull where id != null;

no rows selected

空字符串''在oracle中被示为NULL值了。比较怪异。

 

Oracle这种现象的重现过程如下:

SQL> create table testnull(id varchar(32));

Table created.

SQL> insert into testnull values('');

1 row created.

SQL> select * from testnull where id is null;

ID
----------------------------------------------------------------


SQL> select count(*) from testnull where id is null;

  COUNT(*)
----------
         1

SQL>
 

阅读(1041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~