我正在使用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 条记录?
答案 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
答案 1 :(得分:3)
这是意料之中的,因为与null
值进行比较时特殊行为:
与null
值的任何比较都将得出unknown
,这将从结果中排除记录。
您可以在此处获得更多收益:Three valued logic in SQL。在那里,您可以阅读:
没有什么等于空。甚至没有null等于null