也来说说SQL语句中NULL的真实含义

本文探讨了不同数据库系统中NULL值的处理方式,特别是在Sybase ASA和Oracle中的表现。NULL值不能用等于或不等于进行判断,需使用is null或is not null。揭示了空字符串在Oracle中被视为NULL值的现象。

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 idis null

结果为(NULL)

select * from testnull where idis notnull

结果为('')

当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>

<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
ISNULL函数是SQL Server中用于处理空值的函数,它可以检查表达式是否为NULL,并提供一个替代值。在不同的SQL语句部分,ISNULL函数有不同的应用场景: ### 在SELECT语句中使用 在SELECT语句里,可对查询结果中的空值进行处理。如在sql汇总计算中,可将null处理成0或者其他逻辑值,示例代码如下: ```sql DECLARE @dataid INT, @quality INT, @bdid INT; SET @bdid = 1; SELECT @dataid = DataID, @quality = ISNULL(Qualify, 0) FROM Bank_DataList WHERE id = @bdid; ``` 上述代码中,若`Qualify`字段的值为NULL,就会用0来替代,保证汇总计算的准确性 [^3]。 ### 在WHERE子句中使用 在WHERE子句中使用ISNULL函数,能对包含空值的数据进行过滤。示例如下: ```sql SELECT column1, column2 FROM your_table WHERE ISNULL(column1, 'default_value') = 'search_value'; ``` 此代码里,若`column1`为NULL,会用`default_value`替代,接着和`search_value`进行比较 [^1]。 ### 在ORDER BY子句中使用 在ORDER BY子句中使用ISNULL函数,可对包含空值的数据进行排序。示例如下: ```sql SELECT column1, column2 FROM your_table ORDER BY ISNULL(column1, 'default_value'); ``` 上述代码中,若`column1`为NULL,会用`default_value`替代后再排序 [^1]。 ### 不同数据库的替代方案 并非所有数据库都支持ISNULL函数,如Oracle没有ISNULL()函数,不过可以使用NVL()函数达到相同的结果,示例如下: ```sql SELECT ProductName, UnitPrice*(UnitsInStock + NVL(UnitsOnOrder, 0)) FROM your_table; ``` 此代码用NVL函数处理`UnitsOnOrder`可能出现的NULL值 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值