簡體   English   中英

在 SQL 中組合“NOT”和“AND”(特別是 MS Access)

[英]Combining "NOT" and "AND" in SQL (MS Access specifically)

我有一個快速的問題。 我正在嘗試編寫一個在 MS 訪問中結合“NOT”和“AND”的查詢。 但由於某種原因,我沒有得到正確的結果。 例如,如果我有一張桌子:

ID| Name1| Name2|  
1 | a    | a    |  
2 | b    | b    |  
3 | a    |      |  
4 |      | a    |  
5 | a    | b    |  
6 | b    | a    |

我從查詢中想要的是 name1 和 name 2 中不是 b,b 的所有內容,因此除 2 之外的所有 ID。但我只能看到 ID - 1,即 a,a。

我的查詢是

SELECT * FROM TABLE Names
WHERE NOT Name1 = 'b' AND NOT Name2 = 'b' 

只返回 ID 1。

有誰知道我做錯了什么。 謝謝你。

通過僅使用相等測試來避免 NULL,應用 deMorgan 定律:

SELECT * 
FROM Names 
WHERE NOT (Name1 = 'b' AND Name2 = 'b')
 ;

這個想法是:具有NULL值的條件永遠不會測試為真: NULL = 'x'是假的,而NULL <> 'x'也是假的。 (即使NULL = NULL也是假的!)

簡而言之:條件(Name1 = 'b' AND Name2 = 'b')僅適用於id=2的行; 通過將 NOT 應用於此條件,您將獲得除 id=2 之外的所有行。

使用括號來幫助分解邏輯,並且更喜歡<>NOT

SELECT * 
FROM TABLE Names 
WHERE (Name1 <> 'b') OR (Name2 <> 'b')

您可能必須強制使用空值才能獲得 3 和 4:

SELECT * 
FROM TABLE Names 
WHERE (NZ(Name1, "") <> 'b') OR (NZ(Name2, "") <> 'b')

空值應單獨比較或轉換為字符串:

SELECT * FROM TABLE Names WHERE NOT (Nz(Name1,'') = 'b') AND NOT (Nz(Name2,'') = 'b')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM