为什么在WHERE子句中使用NULL列的行在结果中被省略了?

23 浏览
0 Comments

为什么在WHERE子句中使用NULL列的行在结果中被省略了?

这个问题是SQL服务器的bug还是我不知道某些东西?

我有一个"Items"的表,结构如下:

Id - 主键 int 自增
FinalStatus - tinyint (可为空)

数据如下:

Id 状态
1 NULL
2 NULL
3 NULL
4 1
5 2

我试图列出所有状态不等于2的记录:

SELECT * FROM [Items] WHERE [Status] != '2'
SELECT * FROM [Items] WHERE [Status] != 2
SELECT * FROM [Items] WHERE [Status] NOT LIKE '2'
SELECT * FROM [Items] WHERE [Status] NOT IN (2)

所有这些查询只返回一行:

Id 状态
4 1

然而,如果我使用查询:

SELECT * FROM [Items] WHERE [Status] IS NULL

在这种情况下,我只显示所有的NULL行。

由于NULL与2或任何其他数字不同,我对查询结果感到困惑。然而,我在设计这个表时有所不同。

这次我在创建时忘记允许空值,并且我使用SQL Studio事后进行了更改。在我看来,这是问题的原因,但我不知道具体是什么原因。

我可以删除表并重新创建它,但我想学习一些东西。

感谢您的帮助。

0
0 Comments

为什么在WHERE子句中使用带有NULL值的行会被忽略在结果中?

在这个问题中,用户遇到了一个问题:在使用带有NULL值的列的WHERE子句时,这些行为什么会被忽略在结果中。他在查询中使用了ISNULL函数来解决这个问题,但他想知道为什么会出现这种情况以及如何解决。

为了解决这个问题,有用户提到了ANSI_NULLS标准。根据ANSI_NULLS标准的文档,NULL值在比较操作中通常会被忽略。这就是为什么在使用带有NULL值的列的WHERE子句时,这些行会被忽略在结果中的原因。

用户还提到了是否有可能在SQL Studio中更改了服务器设置,导致新创建的表以ANSI_NULL为基础进行操作。其他用户回答说,ANSI_NULLS可以在数据库属性中设置,也可以在查询中使用SET ANSI_NULLS来设置。这种行为在关系数据库中是常见的。用户之前使用的数据库实例中也是开启了ANSI_NULLS选项,所以并没有什么改变。用户可能误解了这个行为,但这是正常的。

然而,用户还提到了在查询中使用函数来包裹谓词的做法是不好的。这样做会阻止索引的使用,并导致表扫描。这可能是用户在这个答案中收到反对票的原因。

总之,为了解决这个问题,用户可以通过设置ANSI_NULLS选项来改变NULL值在比较操作中的行为。此外,用户还应该避免在谓词中使用函数,以避免对性能产生负面影响。

0
0 Comments

为什么在WHERE子句中使用具有NULL值的行会在结果中被省略?这个问题的出现的原因是,数据库中的NULL值被视为未知值,而不是空值。因此,在使用WHERE子句时,如果要包括NULL值,需要将条件设置为"value != 2 or value is null"。这是标准的Ansi SQL行为,与SQL Server Management Studio无关。任何关系型数据库管理系统(RDBMS)都会以同样的方式处理NULL值。这个问题与ansi_nulls设置也无关。关于数据库表的行为突然改变的问题,可能是因为之前的表没有包含NULL值,或者在新创建的表中使用了不同的数据类型或设置。为了更好地处理NULL值,建议在WHERE子句中使用"value != 2 or value is null"的条件,而不是使用isnull函数。这样可以避免索引或表的完全扫描,提高查询性能。

0