有人能解释一下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中的以下行为吗?
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)
当前回答
NULL不能使用比较操作符与任何值进行比较。NULL = NULL为false。Null不是一个值。IS运算符是专门为处理NULL比较而设计的。
其他回答
NULL的唯一测试是is NULL或is NOT NULL。检验是否相等是毫无意义的,因为根据定义,人们不知道值是多少。
下面是维基百科上的一篇文章:
https://en.wikipedia.org/wiki/Null_ (SQL)
NULL不能使用比较操作符与任何值进行比较。NULL = NULL为false。Null不是一个值。IS运算符是专门为处理NULL比较而设计的。
注意,这个行为是默认的(ANSI)行为。
如果你:
SET ANSI_NULLS OFF
http://msdn.microsoft.com/en-us/library/ms188048.aspx
你会得到不同的结果。
SET ANSI_NULLS OFF显然将在未来消失…
Null表示没有值或未知值。它没有指定为什么没有值,这可能会导致一些歧义。
假设你像这样运行一个查询:
SELECT *
FROM orders
WHERE delivered=ordered;
也就是说,您正在寻找订购日期和交付日期相同的行。
当其中一列或两列都为空时会发生什么?
因为至少有一个日期是未知的,你不能指望说这两个日期是相同的。当两个日期都未知时也是如此:如果我们甚至不知道它们是什么,它们怎么可能是相同的呢?
因此,任何将null作为值处理的表达式都必须失败。在本例中,它将不匹配。如果你尝试以下方法,也会有同样的效果:
SELECT *
FROM orders
WHERE delivered<>ordered;
再说一次,如果我们不知道两个值是什么,我们怎么能说它们不一样呢?
SQL对缺失值有一个特定的测试:
IS NULL
具体来说,它不是比较值,而是寻找缺失的值。
最后,关于!=操作符,据我所知,它实际上不在任何标准中,但它得到了广泛的支持。它的加入是为了让来自某些语言的程序员感觉更自在。坦率地说,如果一个程序员很难记住他们正在使用的语言,那么他们就没有一个好的开始。
<>为Standard SQL-92;=是它的等价物。两者都计算值,NULL不是——NULL是一个占位符,表示没有值。
这就是为什么在这种情况下只能使用is NULL/ is NOT NULL作为谓词的原因。
这种行为不是SQL Server特有的。所有符合标准的SQL方言都以相同的方式工作。
注意:如果你的值不是空,你使用is not null进行比较,而如果你的值不是空,你使用<> 'YOUR_VALUE'进行比较。我不能说我的值是否等于NULL,但我可以说我的值是否为NULL或not NULL。如果我的值不是NULL,我可以比较。