2014-10-03 89 views
0

我在查詢SQL Server 2008時遇到了一些問題。查詢不返回NULL的值

我有一個包含一些值和類別的表。這個類別可以是例如股票,債券或NULL。

然後我可以想看看我的表中的一切,是不是債券:

SELECT Value, Name, Currency, Assetclass 
FROM MyTable 
WHERE Assetclass <> 'Bond' 

在這裏,我希望看到我的所有資產是股票和未分類的(NULL)。但是,我只看到股票。我得到了與將Where-condition設置爲Assetclass ='Stock'相同的結果。

我知道NULL被視爲未識別的值,但我希望它只忽略包含完全'Bond'的行並保留其他所有內容,但是顯然不是這種情況?

+0

'WHERE(Assetclass <>「邦德」或Assetclass爲null)'? – 2014-10-03 08:46:04

+0

@huMptyduMpty - >這不起作用 - 我有興趣選擇除了資產類實際包含'Bond'的幾行以外的所有東西。 – ssn 2014-10-03 08:47:50

+0

@Steffen:它會起作用。它將選擇除bond之外的所有非空值(滿足'Assetclass <>'Bond''條件)*以及*所有空值(滿足「Assetclass is null」條件)。 – 2014-10-03 08:52:50

回答

1

正如其他人所指出的那樣,這是預期的行爲。如果你不想做一個OR你總是可以用在其他的東西相比,替換空:

WHERE ISNULL(Assetclass, 'Anything but Bond') <> 'Bond' 
+0

工作就像一個魅力! – ssn 2014-10-03 08:49:08

2

你不能比較使用<>NULL值,你應該改變你的SQL語句:

SELECT Value, Name, Currency, Assetclass 
FROM MyTable 
WHERE Assetclass <> 'Bond' OR Assetclass IS NULL; 

在MySQL中,你有空安全的比較,但不是在SQL Server的情況。

這個想法是NULL不是一個值,因此它不能與其他值進行比較。但是,您可以使用IS NULL檢查字段是否爲NULL。

請檢查這個問題的更深入的瞭解:Why is null<>null=null in mysql

3

這是預期的行爲。

您正在詢問所有與「Bond」不同的值。

NULL不是一個值,而是一個'標記',指出系統不知道該字段的內容;作爲內容未知的系統不能肯定地說價值與「債券」不同,因此該行不被返回。

1

投影將忽略空值。使用ISNULL函數

SELECT Value, Name, Currency, Assetclass 
FROM MyTable 
WHERE Isnull(Assetclass,'') <> 'Bond' 


OR 


SELECT Value, Name, Currency, Assetclass 
FROM MyTable 
WHERE Assetclass is null or Assetclass <> 'Bond' 

我寧願第一種方法