我在表格中有一个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
?
我对编程比较陌生,感谢任何帮助。
答案 0 :(得分:6)
这不是正常行为,因为N/A
(Single
&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 NULL
或IS NOT NULL
。
答案 4 :(得分:2)
正如其他人所说,null通常无法比较。因此,当状态为空时,状态!='N / A'将返回false。
但是其他人还没有提到的是,这是通过Ansi_nulls设置来控制的。默认情况下它是打开的,并且空值不具有可比性(正如您在问题中所述,这背后的原理是它们是未知的,因此它们不一定是N / A是错误的)。但你可以使用
SET ANSI_NULLS OFF
要更改此行为,在这种情况下,null将等于null并且不等于其他任何内容。有关MSDN here的详细信息。