¿Las dos afirmaciones a continuación son equivalentes?
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr
y
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr
¿Hay algún tipo de tabla de verdad que pueda usar para verificar esto?
sql
logical-operators
operator-precedence
Carolina del Norte.
fuente
fuente
Respuestas:
And
tiene prioridad sobreOr
, entonces, incluso sia <=> a1 Or a2
no es lo mismo que
porque eso sería ejecutado como
y lo que quiere, para que sean iguales, es lo siguiente (usar paréntesis para anular las reglas de precedencia):
Aquí hay un ejemplo para ilustrar:
Para aquellos a quienes les gusta consultar referencias (en orden alfabético):
fuente
AND
Entonces estaOR
precedencia es parte del estándar SQL?declare @x tinyInt = 1
declare @y tinyInt = 0
declare @z tinyInt = 0
select case when @x=1 or @y=1 and @z=1 then'T' else 'F' end
select case when (@x=1 or @y=1) and @z=1 then'T' else 'F' end
Agregaré 2 puntos:
Entonces, las 2 expresiones simplemente no son iguales.
Por lo tanto, cuando rompe la cláusula IN, divide los OR en serie y cambia la precedencia.
fuente
Puede usar paréntesis para anular las reglas de precedencia.
fuente
Consulta para mostrar una tabla de verdad de expresión booleana de 3 variables:
Resultados para
(A=1) OR (B=1) AND (C=1)
:resultados para
(A=1) OR ( (B=1) AND (C=1) )
son los mismos.Resultados para
( (A=1) OR (B=1) ) AND (C=1)
:fuente