Na WHERE
cláusula de uma consulta SQL, eu esperaria que essas duas condições tivessem o mesmo comportamento:
NOT (a=1 AND b=1)
vs
a<>1 AND b<>1
A primeira condição se comporta conforme o esperado e, embora eu preveja a segunda condição para fazer a mesma coisa, não.
Isso é muito básico, mas, com vergonha, não consigo ver o que estou fazendo de errado.
a <> 1 OR b<>1
.Respostas:
Eles não são equivalentes.
é equivalente a:
Essa equivalência é conhecida como
De Morgan's Law
. Veja por exemplo:https://en.wikipedia.org/wiki/De_Morgan%27s_laws
Uma boa técnica para provar / refutar equivalências para expressões de álgebra booleana é usar um cte para os domínios e comparar as expressões lado a lado:
Edit: Como o DB2 não suporta o tipo de dados booleano, expandi o exemplo em:
http://sqlfiddle.com/#!15/25e1a/19
A consulta reescrita se parece com:
O resultado da consulta é:
Como mostrado, exp1 e exp2 são equivalentes.
fonte
with T(a) as ( values 0,1,NULL )
- se e executa novamente a consulta e verá o que acontece. NULLs definitivamente acionam uma chave na maioria das regras de equivalência definidas que aprendemos. Resposta curta é a = NULL e uma < > NULL produzem NULL, então eles caem para o caso else.Para uma leitura mais aprofundada: ( stackoverflow.com/questions/1833949/… )Seu primeiro exemplo está dizendo:
Seu segundo exemplo está dizendo:
Para que a segunda consulta retorne o mesmo que a primeira, você deve alterar
AND
paraOR
Isso retorna os seguintes resultados
fonte
a<>1 AND b<>1
traduz em "a = 1 OR b = 1"?NOT ( a=1 OR b=1 )
. Línguas naturais infelizes contêm ambiguidades, o que dificulta a tradução de fórmulas lógicas para línguas naturais e vice-versa. Por exemplo,neither a=1 nor b=1
significaNOT ( a=1 OR b=1 )
ou(NOT a=1) OR (NOT b=1)
?