查询不返回NULL的值
我在查询SQL Server 2008时遇到了一些问题。查询不返回NULL的值
我有一个包含一些值和类别的表。这个类别可以是例如股票,债券或NULL。
然后我可以想看看我的表中的一切,是不是债券:
SELECT Value, Name, Currency, Assetclass
FROM MyTable
WHERE Assetclass <> 'Bond'
在这里,我希望看到我的所有资产是股票和未分类的(NULL)。但是,我只看到股票。我得到了与将Where-condition设置为Assetclass ='Stock'相同的结果。
我知道NULL被视为未识别的值,但我希望它只忽略包含完全'Bond'的行并保留其他所有内容,但是显然不是这种情况?
正如其他人所指出的那样,这是预期的行为。如果你不想做一个OR
你总是可以用在其他的东西相比,替换空:
WHERE ISNULL(Assetclass, 'Anything but Bond') <> 'Bond'
工作就像一个魅力! – ssn 2014-10-03 08:49:08
你不能比较使用<>
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
这是预期的行为。
您正在询问所有与“Bond”不同的值。
NULL
不是一个值,而是一个'标记',指出系统不知道该字段的内容;作为内容未知的系统不能肯定地说价值与“债券”不同,因此该行不被返回。
投影将忽略空值。使用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'
我宁愿第一种方法
'WHERE(Assetclass “邦德”或Assetclass为null)'? – 2014-10-03 08:46:04
@huMptyduMpty - >这不起作用 - 我有兴趣选择除了资产类实际包含'Bond'的几行以外的所有东西。 – ssn 2014-10-03 08:47:50
@Steffen:它会起作用。它将选择除bond之外的所有非空值(满足'Assetclass 'Bond''条件)*以及*所有空值(满足“Assetclass is null”条件)。 – 2014-10-03 08:52:50