IS NULL对某些数据类型不起作用,但IS NOT NULL起作用

时间:2017-08-17 19:04:10

标签: sql sql-server tsql sql-server-2014 isnull

我正在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

它按预期工作,显示两个结果,我也使用

Suffixvarchar)替换为ModifiedDateDatetime
IS NULL AND IS NOT NULL,

它有效。我能够解决我的问题,分解查询,然后使用UNION ALL但不确定我是否在查询上做错了或者IS NULL对某些数据类型无法正常工作(不要认为是)如果有人能解释我为什么会这样,我真的很感激。

由于

它正在以两种方式工作

1 个答案:

答案 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之后的所有内容,它没有后缀或中间名。