En la WHERE
cláusula de una consulta SQL, esperaría que estas dos condiciones tengan el mismo comportamiento:
NOT (a=1 AND b=1)
vs
a<>1 AND b<>1
La primera condición se comporta como se esperaba, y aunque presento la segunda condición para hacer lo mismo, no lo hace.
Esto es algo muy básico, pero avergonzado no puedo ver lo que estoy haciendo mal.
a <> 1 OR b<>1
.Respuestas:
No son equivalentes.
es equivalente a:
Esta equivalencia se conoce como
De Morgan's Law
. Ver por ejemplo:https://en.wikipedia.org/wiki/De_Morgan%27s_laws
Una buena técnica para probar / refutar equivalencias para expresiones de álgebra booleana es usar un cte para los dominios y comparar las expresiones una al lado de la otra:
Editar: como DB2 no admite el tipo de datos booleano, amplié el ejemplo en:
http://sqlfiddle.com/#!15/25e1a/19
La consulta reescrita se ve así:
El resultado de la consulta es:
Como se muestra, exp1 y exp2 son equivalentes.
fuente
with T(a) as ( values 0,1,NULL )
y vuelve a ejecutar la consulta y verá lo que sucede. Los NULL definitivamente arrojan una llave en la mayoría de las reglas de equivalencia establecidas que aprendemos. La respuesta corta es a = NULL y a < > NULL producen NULL, por lo que caerán en el caso de lo contrario. Para leer más: ( stackoverflow.com/questions/1833949/… )Tu primer ejemplo dice:
Su segundo ejemplo dice:
Para la segunda consulta para devolver el mismo que el primero, debe cambiar su
AND
a unaOR
Esto devuelve los siguientes resultados
fuente
a<>1 AND b<>1
traduce como "a = 1 O b = 1"?NOT ( a=1 OR b=1 )
. Los lenguajes naturales desafortunados contienen ambigüedades que dificultan la traducción de fórmulas lógicas a lenguajes naturales y viceversa. Por ejemplo, ¿neither a=1 nor b=1
significaNOT ( a=1 OR b=1 )
o(NOT a=1) OR (NOT b=1)
?