为什么在WHERE子句中使用NULL列的行在结果中被省略了?
为什么在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事后进行了更改。在我看来,这是问题的原因,但我不知道具体是什么原因。
我可以删除表并重新创建它,但我想学习一些东西。
感谢您的帮助。
为什么在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值在比较操作中的行为。此外,用户还应该避免在谓词中使用函数,以避免对性能产生负面影响。
为什么在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函数。这样可以避免索引或表的完全扫描,提高查询性能。