2014-10-03 88 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' 

我宁愿第一种方法