我在查询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;并保留其他所有内容,但显然情况并非如此?
答案 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'