2017-08-17 110 views
0

我運行在SQL Server查詢2014(v12.0.5203​​),但它得到了我的注意,下面的結果,在這裏我的查詢:IS NULL不工作了某些碼數據類型,但IS NOT NULL作品

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 

它的工作如預期,顯示兩個結果,我也沒有用ModifiedDateDatetime)使用

IS NULL AND IS NOT NULL, 

更換Suffixvarchar)和它的工作。我能夠解決我的問題,打破查詢,然後使用UNION ALL,但不知道如果我在查詢上做錯了什麼,或者IS NULL對某些數據類型無法正常工作(不要認爲它是)如果有人能解釋我爲什麼會發生這種情況,我會很感激。

感謝

,它的工作中左右逢源

+5

什麼是應該返回並且不是的行的示例? – Lamak

+4

這是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+6

最可能的解釋是你的數據不是你想象的那樣是。我向你保證IS NULL能夠按預期工作,並且適用於所有數據類型。 –

回答

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它沒有後綴或有一箇中間名之後的一切。