3

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

我需要提取所有 Status 不为 null 且不是“N/A”的行。基本上,我需要所有状态为“单”或“多”的行。

我一直在阅读有关 NULL 实际上等同于“未知”的信息。

如果我说

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

我得到了结果(所有行只包含“Single”或“Multiple”)。

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

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

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

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

4

5 回答 5

6

这不是正常行为,因为N/A( Single&Multiple也是) 是一个与 . 无关的字符串NULL。即使NULL被评估为 unknown 并且可能不会返回,您也应该明确使用IS NOT NULL.

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

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

于 2013-01-07T18:38:47.067 回答
5

SQL 使用三值逻辑:真、假和未知。任何与null结果的比较unknown

所以null <> 'N/A'评估为unknown。由于unknown不正确,这意味着该行被排除在外。

于 2013-01-07T18:41:32.773 回答
2

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

于 2013-01-07T18:39:09.030 回答
2

有点不明显,SQL 具有三个值逻辑(真/假/未知)。任何直接比较NULL都将导致子句中的值被认为是不正确的unknownWHERE您的情况;

WHERE status <> 'N/A'

换句话说,将永远不会匹配空值,因为NULL它永远不会“不等于”任何东西。

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

作为旁注,生活自然从来没有那么简单。

于 2013-01-07T18:43:14.287 回答
2

正如其他人所说, null 通常是不可比较的。因此,当状态为空时,状态 != 'N/A' 会返回为假。

But what others haven't mentioned yet is that that is controlled through the Ansi_nulls setting. By default it is on and nulls are not comparable (as you state in the question, the principal behind this is that they are unknown so it is false that they are not necessarily N/A). But you can use

SET ANSI_NULLS OFF

To change this behavior in which case a null will be equal to a null and not equal to anything else. There is more details on MSDN here.

于 2013-01-07T18:48:50.383 回答