<> (不相等)不适用于简单的访问查询

时间:2011-05-25 15:37:29

标签: ms-access

我有以下查询,我想将所有活跃员工拉到他们的CardStatus<> “失落的卡片”。

SELECT
    dbo_Employee.Status, 
    dbo_EmpBadgeNumbers.EmployeeID_FK, 
    dbo_EmpBadgeNumbers.CardID, 
    dbo_EmpBadgeNumbers.CardStatus 
FROM dbo_Employee INNER JOIN dbo_EmpBadgeNumbers 
        ON dbo_Employee.EmployeeID = dbo_EmpBadgeNumbers.EmployeeID_FK 
WHERE (((dbo_Employee.Status) = "Active") 
    AND ((dbo_EmpBadgeNumbers.CardStatus) <> "Lost Card")); 

如果我更换&lt;&gt; “失落的卡片”和“丢失的卡片”有效,

如果我更换&lt;&gt; “丢失的卡片”是null它可以工作(这给出了我正在寻找的结果)

如果我更换&lt;&gt; “失落的卡片”并非无效。

无论出于何种原因,它都不喜欢“&lt;&gt;”。是的我知道我可以使用“is null”方案来获得相同的结果,我很好奇为什么&lt;&gt;不管用。如果重要,则查询从链接的ODBC连接拉到sql server。

4 个答案:

答案 0 :(得分:4)

将Null与任何内容进行比较只会返回Null:

?Null<>"Lost Card"
Null

?Null="Lost Card"
Null

您需要在标准中对Null进行明确检查:

WHERE (CardStatus <> "Lost Card" Or CardStatus Is Null)

答案 1 :(得分:1)

然后我会尝试

CardStatus is null
OR NOT ( CardStatus = "Lost Card" )

原始的NOT CardStatus =“丢失的卡片”不会等同于

(NOT CardStatus) = "Lost Card"

因为它的基本类型是字符的类型所以将基于“=”进行比较,然后应用逻辑NOT ...例如

NOT (CardStatus = "Lost Card")

答案 2 :(得分:1)

&LT;&GT;永远不会与Null合作。

不正确: WHERE CardStatus&lt;&gt;空
正确: WHERE CardStatus不为空

答案 3 :(得分:1)

我假设您在CardStatus中有两个值:“LostCard”和null(空)

基本上,当您对null进行任何比较时,结果始终是null,并且始终是失败的。这就是创建isNull的原因。