Dans la WHERE
clause d'une requête SQL, je m'attendrais à ce que ces deux conditions aient le même comportement:
NOT (a=1 AND b=1)
contre
a<>1 AND b<>1
La première condition se comporte comme prévu, et bien que j'exige que la seconde condition fasse la même chose, ce n'est pas le cas.
C'est un truc très basique, mais honteusement je ne vois pas ce que je fais mal.
a <> 1 OR b<>1
.Réponses:
Ils ne sont pas équivalents.
est équivalent à:
Cette équivalence est connue sous le nom de
De Morgan's Law
. Voir par exemple:https://en.wikipedia.org/wiki/De_Morgan%27s_laws
Une bonne technique pour prouver / infirmer les équivalences des expressions d'algèbre booléenne consiste à utiliser un cte pour les domaines et à comparer les expressions côte à côte:
Edit: DB2 ne prenant pas en charge le type de données booléen, j'ai développé l'exemple à:
http://sqlfiddle.com/#!15/25e1a/19
La requête réécrite ressemble à:
Le résultat de la requête est:
Comme indiqué, exp1 et exp2 sont équivalents.
la source
with T(a) as ( values 0,1,NULL )
et réexécutez la requête et vous verrez ce qui se passe. Les NULL jettent définitivement une clé dans la plupart des règles d'équivalence définies que nous apprenons. La réponse courte est a = NULL et a < > NULL donnent tous les deux NULL, donc ils tomberont dans le cas else. Pour plus d'informations: ( stackoverflow.com/questions/1833949/… )Votre premier exemple dit:
Votre deuxième exemple dit:
Pour que la deuxième requête renvoie la même chose que la première, vous devez remplacer votre
AND
parOR
Cela renvoie les résultats suivants
la source
a<>1 AND b<>1
traduit par "soit a = 1 OU b = 1"?NOT ( a=1 OR b=1 )
. Les langues naturelles malheureuses contiennent des ambiguïtés qui rendent difficile la traduction de formules logiques en langues naturelles et vice versa. Par exemple,neither a=1 nor b=1
signifieNOT ( a=1 OR b=1 )
ou(NOT a=1) OR (NOT b=1)
?