W WHERE
klauzuli zapytania SQL spodziewałbym się, że te dwa warunki będą miały takie samo zachowanie:
NOT (a=1 AND b=1)
vs
a<>1 AND b<>1
Pierwszy warunek zachowuje się zgodnie z oczekiwaniami i chociaż oczekuję, że drugi warunek robi to samo, tak nie jest.
To bardzo podstawowe rzeczy, ale wstydzę się, że nie widzę, co robię źle.
a <> 1 OR b<>1
.Odpowiedzi:
Nie są równoważne.
jest równoważne z:
Ta równoważność jest znana jako
De Morgan's Law
. Zobacz na przykład:https://en.wikipedia.org/wiki/De_Morgan%27s_laws
Fajną techniką sprawdzania / odrzucania równoważności wyrażeń algebry boolowskiej jest użycie cte dla domen i porównanie wyrażeń obok siebie:
Edycja: Ponieważ DB2 nie obsługuje logicznego typu danych, rozwinąłem przykład pod adresem:
http://sqlfiddle.com/#!15/25e1a/19
Przepisane zapytanie wygląda następująco:
Wynik zapytania jest następujący:
Jak pokazano exp1 i exp2 są równoważne.
źródło
with T(a) as ( values 0,1,NULL )
i ponownie uruchom zapytanie, a zobaczysz, co się stanie. NULL zdecydowanie rzuci klucz w większość ustalonych zasad równoważności, których się uczymy. Krótka odpowiedź to = NULL i < > NULL oba dają NULL, więc przejdą do innego przypadku. Do dalszego czytania: ( stackoverflow.com/questions/1833949/… )Twój pierwszy przykład mówi:
Twój drugi przykład mówi:
Aby drugie zapytanie zwróciło to samo co pierwsze, zmień swoje
AND
naOR
Zwraca to następujące wyniki
źródło
a<>1 AND b<>1
tłumaczy się na „albo a = 1 LUB b = 1”?NOT ( a=1 OR b=1 )
. Niefortunne języki naturalne zawierają dwuznaczności, co utrudnia przetłumaczenie formuł logicznych na języki naturalne i odwrotnie. Na przykładneither a=1 nor b=1
oznaczaNOT ( a=1 OR b=1 )
lub(NOT a=1) OR (NOT b=1)
?