2015-09-04 96 views
0

數據如下:爲什麼比較NOT(x = 0)和NOT(x = NULL)返回相同的值?

ItemID  PrivateSales   PublicSales    TotalSales     SalesPerson 
----------- ----------------------- ----------------------- ---------------------------- ----------------------------- 
1   300      400      700       12 
1   NULL     10      10       12 
2   NULL     NULL     NULL       NULL 
3   NULL     NULL     NULL       NULL 
6   20      900      920       11 
8   22      18      40       10 
9   20      980      1000       11 
22   NULL     NULL     NULL       NULL 
11   NULL     NULL     NULL       NULL 
15   40      NULL     40       77 
16   12      NULL     12       NULL 
44   NULL     44      44       23 

當我運行以下兩個不同的查詢,我得到同樣的結果:

SELECT TOP 1000 [ItemID] 
    ,[PrivateSales] 
    ,[PublicSales] 
    ,[TotalSales] 
    ,[SalesPerson] 
FROM [Sales] 
WHERE NOT (
    PrivateSales IS NULL 
    AND PublicSales IS NULL 
    AND TotalSales IS NULL 
    ) 

AND:

考慮NULL列爲什麼WHERE NOT (x = 0)不返回NULL列? * Sales列是十進制類型,如果重要的話。

+2

**'NULL' '','=,=,<, >'總是NULL。句點。**'NOT(x = 0)'與'x <> 0'相同,所以當x爲NULL時,它不會被返回。與NULL比較使用'IS NULL/IS NOT NULL' – lad2025

+0

至少在SQLAny在哪裏(和我猜ASE)有一個選項叫做ansinull,它正在改變compat。原因。我不知道MS SQL,但也許它與它有關。 (因此將行爲從stadard SQL改爲) – frlan

+0

是的,存在[SET ANSI_NULLS](https://msdn.microsoft.com/en-us/library/ms188048.aspx),但請保留它。 '當SET ANSI_NULLS爲ON時,即使column_name中有空值,使用WHERE column_name = NULL的SELECT語句也會返回零行。' – lad2025

回答

1

看到這個link爲空值,

比較與空空結果的任何true或false值,有效地你是否定空不產生真或假 它沒有返回空值是否爲NULL未確定所以不履行狀態,它不等於0或等於0(它是未知的)

比較NOT(X = 0)和NOT(X = NULL)應該是

NOT (x= 0) And x is not null 

x<>0 and x is not null 

重申lad2025的評論

「NULL與<>,!=,=,<,>始終爲NULL。期。 NOT(X = 0)是相同的X <> 0"

1

的排中,即法說A或NOT A被同義反復中,失去了與引入第三真相值爲NULL SQL Server的這個事實的實現是將布爾型NULL解釋爲UNKNOWN;傳播UNKNOWN;並且將UNKNOWN合併爲FALSE,除非已經執行鍼對UNKNOWN(又名NULL)的顯式測試

相關問題