我正在使用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 条记录?
您需要处理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
相关:SQL 的三值逻辑
这是
意料之中的,因为与null
值相比,特殊行为:
任何与null
值的比较都会评估为unknown
,这会从结果中排除记录。
您可以在此处了解更多信息:SQL中的三个有价值的逻辑。在那里你可以读到:
没有什么等于空。甚至不等于空