我正在SQL Server 2014(v12.0.5203)中运行查询,但它引起了我的注意,结果如下:
SELECT TOP (1000)
[CustomerID], [NameStyle], [Title],
[LastName], [Suffix], [CompanyName],
[SalesPerson], [EmailAddress], [ModifiedDate]
FROM
[AdventureWorksLT2012].[SalesLT].[Customer]
WHERE
NameStyle = 0
AND (([Suffix] IS NULL)
OR (MiddleName IS NOT NULL
AND ModifiedDate > '20030901'))
这样我只会在[Suffix] IS NULL
时得到结果,忽略
OR
(MiddleName IS NOT NULL
AND ModifiedDate > '20030901'
但如果我改变了
[Suffix] IS NULL by [Suffix] IS NOT NULL
它按预期工作,显示两个结果,我也使用
将Suffix
(varchar
)替换为ModifiedDate
(Datetime
)
IS NULL AND IS NOT NULL,
它有效。我能够解决我的问题,分解查询,然后使用UNION ALL但不确定我是否在查询上做错了或者IS NULL对某些数据类型无法正常工作(不要认为是)如果有人能解释我为什么会这样,我真的很感激。
由于
它正在以两种方式工作
答案 0 :(得分:0)
所以......
OR (MiddleName IS NOT NULL AND ModifiedDate > '20030901')
将中间名和修改日期过滤器组合在一起。如果大多数记录没有中间名(它为空),那么您将无法获得多条记录。
您的代码
(([Suffix] IS NULL)
OR (MiddleName IS NOT NULL AND ModifiedDate > '20030901'))
返回的结果是没有后缀或者中间名和修改日期在范围内。
我想你想要
(([Suffix] IS NULL OR MiddleName IS NOT NULL)
AND ModifiedDate > '20030901')
这将为您提供2003-9-1之后的所有内容,它没有后缀或中间名。