2011-05-25 46 views
3

我有以下查詢,我想要將所有活動員工的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")); 

如果我更換<>「失卡」與「失卡」它的工作原理,

如果我更換<>「失卡」與爲空它的工作原理(其給出結果我尋找)

如果我將<>「丟失的卡」替換爲不爲null它的作品。

無論出於何種原因,它不喜歡「<>」。是的,我知道我可以使用「is null」方案來獲得相同的結果,我很好奇爲什麼<>不起作用。如果重要的話查詢從鏈接的ODBC連接拉到sql server。

+0

什麼是完整的查詢?在子句中是否還有其他條件? – Olaf 2011-05-25 15:41:18

+0

請發佈您的_complete_ SQL語句。最好從你的工作空間複製'n粘貼,而不是重新輸入,以防萬一你錯過了一個微妙的錯誤。 – 2011-05-25 15:41:31

+0

只需要清楚你是否期望'<>「Lost Card」與NULL值匹配? – 2011-05-25 15:52:25

回答

4

空到任何東西會比較簡單地返回null:

?Null<>"Lost Card" 
Null 

?Null="Lost Card" 
Null 

你需要做的空直接檢查你的標準:

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

我會再嘗試

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

原版本沒有CardStatus =「失卡」不會等同於爲

(NOT CardStatus) = "Lost Card" 

作爲其基本類型是性格的,因此我們將比較基礎上, 「=」,然後應用邏輯NOT ...如

NOT (CardStatus = "Lost Card") 
+0

即使您沒有(CardStatus =「Lost Card」),它也會被評估爲(不CardStatus)=「丟失卡」 – ic3b3rg 2011-05-25 15:52:38

+1

,但它仍然會失敗,因爲CardStatus = Null評估爲Null和Not )'評估爲null,這會導致錯誤的結果。 – BIBD 2011-05-25 15:55:43

+0

嗨@drapp很好的答案。謝謝。 – 2017-06-27 09:11:48

1

<>永遠不會與Nu二。

錯誤: WHERE CardStatus <>空
正確: WHERE CardStatus IS NOT NULL

1

我假設你有兩個值CardStatus: 「LostCard」 和null(空)

基本上,當你對null進行任何比較時,結果始終爲null,並且總是失敗。這就是isNull創建的原因。

+0

實際上,IsNull()函數在這裏並不真正相關。如果你真的只有兩個有效值,「LostCard」和Null,那麼你只需要測試'Is Not Null'來獲取丟失的卡片。使用SQL'Is Null'操作符將使用索引,而使用IsNull()函數可能會阻止使用它們。 – 2011-05-28 22:56:46