你真的理解T-sql中的NULL吗?

NULL不表示什么?
NULL不表示空字符串,不表示0。

NULL表示什么?
NULL表示不知道是什么,就是说NULL的原意是不知道是什么,表示可能什么都是。

NULL与?做比较

PRINT  ( Case   When   NULL   = ' Value '   Then   ' true '   else   ' false '   end )
PRINT  ( Case   When   NULL != ' Value '   Then   ' true '   else   ' false '   end )
PRINT  ( Case   When   NULL != NULL   Then   ' true '   else   ' false '   end )
PRINT  ( Case   When   NULL = NULL   Then   ' true '   else   ' false '   end )

 

大家猜一下上面的4行表达式会返回什么?,答案在下面

ContractedBlock.gif ExpandedBlockStart.gif 答案
false
false
false
false


为什么会有这样的结果呢?
答案在MSDN上:
A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.
既然如此,那我们应该怎样与NULL值做比较呢,答案是用ISNULL函数,T-sql中ISNULL函数有两个参数,第一个参数是要检查是否为NULL的表达式,第二个参数是如果要检查表达式为NULL时函数的返回值。

NULL与其他数值做运算

PRINT   NULL
PRINT   1   +   NULL ;
PRINT   ' yukaizhao '   +   NULL ;
DECLARE   @d   datetime ;
SET   @d   =   GETDATE ();
PRINT   @d   +   NULL ;

 

大家猜一下上面的语句会PRINT出来什么?
答案是什么都没有,所有运算都和PRINT NULL是相同结果,结果还是NULL

NULL值与索引
如果一个列中有NULL值,那么不可以在这个列上建唯一索引,可以建立非唯一索引;但是如果一个字段有很多行有NULL值,那么在这个字段上建索引效果不佳。所以建议不在在一个频繁出现NULL值的字段上建索引(有待证实)

NULL与排序
NULL参与排序时总是作为最小值存在,即ORDER BY COL ASC时COL为NULL的行在最前面,反之在最后面。

附注:t-sql中三个关于NULL的函数:
ISNULL(check_expression, replacement_value)

check_expression 与 replacement_value 数据类型必须一致
如果 check_expression 为 NULL,则返回 replacement_value
如果 check_expression 不为 NULL,则返回 check_expression
 

NULLIF 用于检查两个表达式,语法:
NULLIF(expression, expression)

如果两个 expression 相等,则返回 NULL,该 NULL 为第一个 expression 的数据类型
如果两个 expression 不相等,则返回第一个 expression

COALESCE()函数可以接受一系列的值,如果列表中所有项都为空(null),那么只使用一个值。然后,它将返回第一个非空值。这一技巧描述了创造性使用SQL Server 中COALESCE()函数的两种方法。

具体用法请参考:http://www.builder.com.cn/2007/0518/401640.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值