使用此特定过滤器时,是什么导致我的T-SQL查询输出不一致?

时间:2018-12-23 12:56:10

标签: sql sql-server tsql

我正在使用SSMS,并且具有以下T-SQL查询:

USE MyDatabase

SELECT
...
FROM VIEW1

WHERE [ArrivalDate] BETWEEN '2015-01-01' AND '2018-11-30'
AND ([Reason For Stay] = 'SINGL' AND [Total Guest] = 2 AND [Sum of Child] = 0)
AND [Booking type] = 'FIT'

上面的查询输出 250 条记录。

在查询末尾添加以下过滤器,输出 30 条记录:

AND [Title] = 'MR&MRS'

当我将上面的过滤器更改为:

AND [Title] <> 'MR&MRS'

我希望获得 220 条记录(很明显),但是查询会输出 188 条记录!

SSMS的“邮件”标签下,我得到以下信息:

  

警告:通过聚合或其他SET操作消除了空值。

这可能是怎么回事?以及如何更正我的T-SQL查询以获取 220 条记录?

2 个答案:

答案 0 :(得分:7)

您需要处理NULLs

USE MyDatabase

SELECT
...
FROM VIEW1

WHERE [ArrivalDate] BETWEEN '2015-01-01' AND '2018-11-30'
AND ([Reason For Stay] = 'SINGL' AND [Total Guest] = 2 AND [Sum of Child] = 0)
AND [Booking type] = 'FIT'
AND ([Title] <> 'MR&MRS' OR [Title] IS NULL)
                             -- here

相关:The Three-Valued Logic of SQL

答案 1 :(得分:3)

这是意料之中的,因为与null值进行比较时特殊行为:

null值的任何比较都将得出unknown,这将从结果中排除记录。

您可以在此处获得更多收益:Three valued logic in SQL。在那里,您可以阅读:

  

没有什么等于空。甚至没有null等于null