[英]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.