2016-07-27 46 views
4

中選擇值我已經寫了一個sql查詢來獲取所有記錄但不是特定的。爲什麼NULL值被排除在從表

我的表有一個column3類型INT,也可以有一些空值。但是下面的查詢忽略了column3中有NULL的記錄。

表1:

ID | Column1 | Column2 | Column3 
1  xyz  xyz  200 
2  xyz  xyz  201 
3  xyz  xyz  NULL 
4  xyz  xyz  NULL 
5  xyz  xyz  201 

SQL查詢:

SELECT 
    [ID], 
    [Column1], [Column2], [Column3] // (int, null) 
FROM 
    [Table1] 
WHERE 
    Column3 != 201 

LINQ查詢:

from tb in _entities.Table1 
where tb.Column3 != 201 

由於兩個空不能等於即NULL = NULL始終爲false。爲什麼上述查詢將排除空值的記錄。只有第一條記錄正在返回。

回答

2

您需要explicitly指定要NULL值:

from tb in _entities.Table1 
where tb.Column3 == null || tb.Column3 != 201 

當空值存在於數據,邏輯和比較運算 有可能返回UNKNOWN的第三個結果,而不是僅僅TRUE 或FALSE。這種對三值邏輯的需求是許多應用程序錯誤的來源。

Transact-SQL還提供了空處理的擴展。如果 選項ANSI_NULLS設置爲OFF,則空值之間的比較(例如 NULL = NULL)計算爲TRUE。 NULL與任何數據之間的比較 值評估爲FALSE

+1

可以請你解釋一下爲什麼? –

+0

@GiladGreen解釋。 – user3185569

+0

謝謝,不知道:) –

0

如果用邏輯運算符比較NULL和任何(甚至是NULL),它將返回false。所以NULL!= 201是錯誤的。您需要使用這樣的事情:

where tb.Column3 is null or tb.Column3 != 201 

,或者您可以使用ISNULL聲明:

where isnull(tb.Column3, 0) != 201 
0

SQL Server有比C#不同的NULL-語義。在C#中,當某些東西是!= 201時,它可能爲空。但是,在SQL Server中,當某物=!201時,它可能不爲空。因此,你必須告訴您要NULL或SQL Server!= 201

from tb in _entities.Table1 
where tb.Column3 == null || tb.Column3 != 201 
1

因爲null在SQL表示 '未知'。你能說'你不知道的東西'不是201?不,你不能。

所以你必須明確地告訴你想通過檢查null平等來包含空值。在這方面,數據庫不同於C#編程語言,其中null == null

這會做:

where tb.Column3 == null || tb.Column3 != 201 
相關問題