问题描述
|
我有以下查询,我要将所有在职员工的CardStatus <> \“ Lost Card \”拉到哪里。
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\"));
如果我将<> \“ Lost Card \”替换为\“ Lost Card \”,它会起作用,
如果我将<> \“ Lost Card \”替换为null,它将起作用(这将给出我正在寻找的结果)
如果我将<> \“ Lost Card \”替换为非null,则可以使用。
无论出于什么原因,它都不喜欢\“ <> \”。是的,我知道我可以使用\“ is null \\”方案来获得相同的结果,我很好奇<>为什么不起作用。如果很重要,查询将从链接的ODBC连接拉至sql服务器。
解决方法
将Null与任何内容进行比较只会返回Null:
?Null<>\"Lost Card\"
Null
?Null=\"Lost Card\"
Null
您需要在您的条件中对Null进行显式检查:
WHERE (CardStatus <> \"Lost Card\" Or CardStatus Is Null)
,<>永远不会与Null一起使用。
错误:WHERE CardStatus <>为空
正确:WHERE CardStatus不为空
,我假设您在CardStatus中有两个值:\“ LostCard \”和null
(空)
基本上,当您对null
做任何比较时,结果始终是null
,并且总是失败。这就是创建isNull的原因。
,然后我会尝试
CardStatus is null
OR NOT ( CardStatus = \"Lost Card\" )
原始的NOT CardStatus = \“ Lost Card \”不会等同于
(NOT CardStatus) = \"Lost Card\"
因为它的基本类型是字符的类型,所以将基于\“ = \”进行比较,然后应用逻辑NOT ...,例如
NOT (CardStatus = \"Lost Card\")