有人能解释一下SQL中的以下行为吗?

SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)

当前回答

在SQL中,任何用NULL计算的结果都是UNKNOWN

这就是为什么SELECT * FROM MyTable WHERE MyColumn != NULL或SELECT * FROM MyTable WHERE MyColumn <> NULL给出0结果的原因。

为了检查NULL值,提供了isNull函数。

此外,您可以像在第三个查询中使用的那样使用IS操作符。

其他回答

注意,这个行为是默认的(ANSI)行为。

如果你:

 SET ANSI_NULLS OFF

http://msdn.microsoft.com/en-us/library/ms188048.aspx

你会得到不同的结果。

SET ANSI_NULLS OFF显然将在未来消失…

在SQL中,任何用NULL计算的结果都是UNKNOWN

这就是为什么SELECT * FROM MyTable WHERE MyColumn != NULL或SELECT * FROM MyTable WHERE MyColumn <> NULL给出0结果的原因。

为了检查NULL值,提供了isNull函数。

此外,您可以像在第三个查询中使用的那样使用IS操作符。

NULL不是任何东西…这是未知的。NULL不等于任何东西。这就是为什么在SQL查询中必须使用神奇的短语is NULL而不是= NULL

你可以参考这个:http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx

NULL不能使用比较操作符与任何值进行比较。NULL = NULL为false。Null不是一个值。IS运算符是专门为处理NULL比较而设计的。

NULL没有值,因此不能使用标量值操作符进行比较。

换句话说,没有值可以等于(或不等于)NULL,因为NULL没有值。

因此,SQL有特殊的IS NULL和IS NOT NULL谓词来处理NULL。