0

当我运行以下查询时:

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

我得到 0 个结果。

但是如果我运行它

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

然后它按预期工作..

这些有什么区别?

4

3 回答 3

8

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

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

第二条语句检查 IPAddress 不等于字符序列“NULL”的位置。

于 2012-08-08T15:56:16.197 回答
2

第一个片段是不正确的。NULL <> NULL 总是假的,因为根据定义,NULL 永远不会等于它自己:你不知道它是否等于它自己,所以比较实际上是假的。第二个片段使用了一个恰好与您的任何数据都不匹配的字符串文字。

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

select top 5 * from  BI_Completes (nolock)where IPAddress IS NOT NULL
于 2012-08-08T15:56:47.570 回答
2

查看这篇MSDN 文章,讨论与NULL.

在您的情况下,您似乎得到了 的结果UNKNOWN,这就是为什么没有返回任何内容的原因。可能您已ANSI_NULLS设置为ON,这将导致UNKNOWN返回值。此外,您在第二个示例中比较的“NULL”是字符串比较。

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

于 2012-08-08T15:57:29.067 回答