In der WHERE
Klausel einer SQL-Abfrage würde ich erwarten, dass diese beiden Bedingungen dasselbe Verhalten aufweisen:
NOT (a=1 AND b=1)
vs
a<>1 AND b<>1
Die erste Bedingung verhält sich wie erwartet, und während ich die zweite Bedingung für dasselbe erwarte, ist dies nicht der Fall.
Das ist sehr grundlegend, aber ich kann leider nicht sehen, was ich falsch mache.
a <> 1 OR b<>1
.Antworten:
Sie sind nicht gleichwertig.
ist gleichbedeutend mit:
Diese Äquivalenz ist bekannt als
De Morgan's Law
. Siehe zum Beispiel:https://en.wikipedia.org/wiki/De_Morgan%27s_laws
Eine gute Technik, um Äquivalenzen für boolesche Algebra-Ausdrücke zu beweisen / zu widerlegen, besteht darin, ein cte für die Domänen zu verwenden und die Ausdrücke nebeneinander zu vergleichen:
Bearbeiten: Da DB2 den Booleschen Datentyp nicht unterstützt, habe ich das Beispiel um Folgendes erweitert:
http://sqlfiddle.com/#!15/25e1a/19
Die umgeschriebene Abfrage sieht folgendermaßen aus:
Das Ergebnis der Abfrage ist:
Wie gezeigt sind exp1 und exp2 äquivalent.
quelle
with T(a) as ( values 0,1,NULL )
die Abfrage und führt sie erneut aus, und Sie werden sehen, was passiert. NULLs werfen definitiv einen Schraubenschlüssel in die meisten gesetzten Äquivalenzregeln, die wir kennen. Die kurze Antwort lautet a = NULL und a < > NULL beide ergeben NULL, daher fallen sie in den Fall else. Für weitere Informationen : ( stackoverflow.com/questions/1833949/… )Ihr erstes Beispiel lautet:
Ihr zweites Beispiel lautet:
Damit die zweite Abfrage dieselbe wie die erste zurückgibt, sollten Sie Ihre
AND
in eine ändernOR
Dies gibt die folgenden Ergebnisse zurück
quelle
a<>1 AND b<>1
"entweder a = 1 ODER b = 1" bedeutet?NOT ( a=1 OR b=1 )
. Unglückliche natürliche Sprachen enthalten Mehrdeutigkeiten, die es schwierig machen, logische Formeln in natürliche Sprachen zu übersetzen und umgekehrt. Zum Beispiel istneither a=1 nor b=1
meineNOT ( a=1 OR b=1 )
oder(NOT a=1) OR (NOT b=1)
?