查询不返回NULL的值

时间:2014-10-03 08:41:44

标签: sql sql-server sql-server-2008

我在查询SQL Server 2008时遇到了一些麻烦。

我有一个包含一些值和类别的表。这个类别可以是例如股票,债券或NULL。

然后我可能想看到我桌子里的所有东西都不是债券:

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

在这里,我希望看到我的所有资产都是Stock和notategorised(NULL)。但相反,我只看到股票。我得到的结果与将我的Where-condition设置为Assetclass =&#39; Stock&#39;。

我知道NULL被视为一个未识别的值,但我希望它只会忽略那些包含&#39; Bond&#39;并保留其他所有内容,但显然情况并非如此?

4 个答案:

答案 0 :(得分:3)

这是预期的行为。

您要求的所有行的值与&#39; Bond&#39;不同。

NULL不是一个值,而是一个&#39;标记&#39;声明系统对该领域的内容一无所知;作为未知的内容,系统无法确定该值是否与“邦德”不同。因此不会返回该行。

答案 1 :(得分: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

答案 2 :(得分: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'

我更喜欢第一种方法

答案 3 :(得分:1)

正如其他人所指出的,这是预期的行为。如果你不想做OR,你总是可以用比较中的其他东西替换null:

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