2012-05-02 125 views
16

如何選擇不等於值並且在返回的數據中包含空值的行? 我已經試過:T-SQL:選擇不等於某個值的行,包括空值

SET ANSI_NULLS OFF 
SELECT TOP 30 FROM Mails 
WHERE assignedByTeam <> 'team01' 

我想返回沒有「team01」在列assignedByTeam行,但我也希望包含空值的結果。不幸的是,上面的代碼不起作用(不返回空值)。

我正在使用MS SQL Server 2008 Express。

回答

19

嘗試明確檢查NULL:

SELECT TOP 30 col1, col2, ..., coln 
FROM Mails 
WHERE (assignedByTeam <> 'team01' OR assignedByTeam IS NULL) 
+0

+1這是布爾邏輯的美妙之處。 – JonH

+1

嗯,是的,但我認爲這樣做有一個簡短的方法,就像一個命令,而不是寫一些命令。無論如何,感謝您的努力! – Val

+4

@ValCool:在SQL標準中有一個稱爲「IS DISTINCT FROM」的操作符,但SQL Server不支持它。 MySQL有非標準的空值安全的相等運算符'NOT a <=> b',但是SQL Server也不能這樣做。 –

0
where column != 'value' or column is null 
+0

''='在大多數SQL方言中都有效嗎? – MarioDS

+1

@MarioDeSchaepmeester:是的。 –

3
SELECT TOP 30 FROM Mails 
WHERE assignedByTeam <> 'team01' 
OR assignedByTeam is null 
8

當你有很多的條件,打字一切太臭了兩次。這裏有兩個更好的選擇:

SELECT TOP 30 FROM Mails 
WHERE COALESCE(assignedByTeam,'') <> 'team01' 

COALESCE運算符返回列表中的第一個非空值。如果assignedByTeam不爲null,則它會將assignedByTeam值與'team01'進行比較。但是如果assignedByTeam爲null,它將比較一個空白的''到'team01'。它基本上簡寫如下:

SELECT TOP 30 FROM Mails 
WHERE (CASE WHEN assignedByTeam IS NULL THEN '' ELSE assignedByTeam END) <> 'team01' 

第二種方法是使你的病情的條件,例如:

SELECT TOP 30 FROM Mails 
WHERE 1 = CASE WHEN assignedByTeam = 'team01' THEN 0 ELSE 1 END 

在這個例子中,ELSE值將包括所有的空行,因爲他們AREN不等於'team01'。

+0

如果我可以爲此投兩次票,我會的。 – Matt

+0

得到我的投票。豎起大拇指。 – MikeJRamsey56

10
SELECT TOP 30 FROM Mails 
WHERE ISNULL(AssignedByTeam,'') <> 'team01' 

我看到一個coalesce語句版本,但ISNULL()更有效。

+1

這是我認爲最優雅的解決方案。 – Amarundo

相關問題