2016-03-29 10 views
1

Ich habe eine kurze Frage bitte. Ich versuche, eine Abfrage zu schreiben, die "NOT" und "AND" in MS-Zugriff kombiniert. Aber aus irgendeinem Grund bekomme ich nicht das richtige Ergebnis. wenn ich eine Tabelle habe zum Beispiel:Kombinieren von "NOT" und "UND" in SQL (MS Access speziell)

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

Was ich von meiner Anfrage will, ist alles von name1 und Namen 2, die nicht b, b so alle IDs außer 2., aber ich kann nur ID sehen - 1 welches ist a, a.

Meine Frage ist

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

die nur ID zurückgibt 1.

Weiß jemand, was ich falsch mache. Vielen Dank. zu brechen

+0

Und Sie wollen auch IDs 3 und 4 im Ergebnis? (google for "dreiwertige Logik") – joop

Antwort

1

Vermeiden ing die NULL-Werte von nur Gleichheit Tests unter Verwendung der Anwendung DeMorgans Gesetze:

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

Die Idee ist: Bedingungen mit NULL Werte nie testen wahr: NULL = 'x' falsch ist, und NULL <> 'x' ist auch falsch. (auch NULL = NULL ist falsch!)

Kurz gesagt: die Bedingung (Name1 = 'b' AND Name2 = 'b') gilt nur für die Zeile mit id=2; Wenn Sie NICHT auf diese Bedingung anwenden, erhalten Sie alle Zeilen außer ID = 2.

+0

'NULL = 'x'' gibt Null zurück. 'NULL <> 'x'' gibt Null zurück. 'NULL = NULL' gibt Null zurück. – HansUp

+0

... was nicht wahr ist, das war mein Fall. – joop

0

Verwenden Sie Klammern Bits Logik zu helfen, und bevorzugen <> über NOT

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

Sie müssen Nullwerte zwingen kann 3 und 4 zu erhalten: sollte

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

Nullwerte sein separat verglichen oder in Zeichenkette umgewandelt:

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