为什么T-SQL允许NULL和'NULL'

时间:2012-08-08 15:53:17

标签: sql-server-2008 tsql

当我运行以下查询时:

select top 5 * from  BI_Completes (nolock)where IPAddress <> NULL

我得到0结果。

但如果我将其作为

运行
select top 5 * from  BI_Completes (nolock)where IPAddress <> 'NULL'

然后按预期工作..

这些之间有什么区别?

3 个答案:

答案 0 :(得分:8)

您不能将比较运算符与NULL一起使用,因为无法比较NULL,也不能与自身进行比较 您必须使用IS运算符:

select top 5 * 
from  BI_Completes (nolock)
where IPAddress IS NOT NULL

第二个语句,检查IPAddress不等于字符序列'NULL'。

答案 1 :(得分:2)

第一个片段不正确。 NULL&lt;&gt; NULL始终为false,因为NULL根据定义永远不等于它自己:您无法知道它是否等于自身,因此比较有效 false。第二个片段使用的字符串文字恰好与您的任何数据都不匹配。

您应该使用的正确代码如下所示:

select top 5 * from  BI_Completes (nolock)where IPAddress IS NOT NULL

答案 2 :(得分:2)

查看this MSDN文章,讨论与NULL的比较。

在你的情况下,看起来你得到了UNKNOWN的结果,这就是为什么没有返回的原因。您可能将ANSI_NULLS设置为ON,这将导致返回UNKNOWN的值。此外,您在第二个示例中与之比较的'NULL'是字符串比较。

Andrea或Joel关于处理NULL的正确方法的答案是正确的(使用IS NOT NULL而不是检查相等性。)