SQL Server查询中的NULL值

时间:2013-01-07 18:36:32

标签: sql sql-server tsql

我在表格中有一个Status列,它有3个值 - 'N / A','Single','Multiple'。某些行的“状态”列的值为NULL

我需要提取Status不为空且不是'N / A'的所有行。基本上,我需要状态为“Single”或“Multiple”的所有行。

我一直在阅读关于NULL实际上等同于'UNKNOWN'。

如果我说

SELECT *
FROM t_userstatus
WHERE status <> 'N/A'

我得到了结果(所有行只包含“单个”或“多个”)。

我想知道的是,上面的WHERE子句是否总是排除具有NULL值的行?这是预期的行为吗?

即使我没有明确指定它,是什么原因导致排除空行?

在我的查询中,我是否必须明确说明状态IS NOT NULL

我对编程比较陌生,感谢任何帮助。

5 个答案:

答案 0 :(得分:6)

这不是正常行为,因为N/ASingle&amp; Multiple)是一个与NULL无关的字符串。即使NULL被评估为未知且可能无法返回,但您明确使用IS NOT NULL

SELECT [column_list] FROM t_userstatus
WHERE status IS NOT NULL AND status <> 'N/A'

我还建议你养成指定列表的习惯。

答案 1 :(得分:5)

SQL使用three-valued logic:true,false和unknown。与null的任何比较都会产生unknown

因此null <> 'N/A'评估为unknown。由于unknown不正确,这意味着排除了该行。

答案 2 :(得分:2)

是的,这是正常行为。 NULL值没有值,因此不满足WHERE条件。如果您还想包含空值,则还需要指定IS NOT NULL

答案 3 :(得分:2)

有点不明显,SQL有三个有价值的逻辑(真/假/未知)。与NULL的任何直接比较都会导致unknown子句中的值WHERE被视为非真。你的病情;

WHERE status <> 'N/A'
换句话说,

永远不会匹配null,因为NULL永远不会与任何东西“不相等”。

使用比较匹配NULL的唯一方法是使用特殊的空操作IS NULLIS NOT NULL

作为旁注,life is naturally never quite that simple.

答案 4 :(得分:2)

正如其他人所说,null通常无法比较。因此,当状态为空时,状态!='N / A'将返回false。

但是其他人还没有提到的是,这是通过Ansi_nulls设置来控制的。默认情况下它是打开的,并且空值不具有可比性(正如您在问题中所述,这背后的原理是它们是未知的,因此它们不一定是N / A是错误的)。但你可以使用

SET ANSI_NULLS OFF

要更改此行为,在这种情况下,null将等于null并且不等于其他任何内容。有关MSDN here的详细信息。