As duas afirmações abaixo são equivalentes?
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr
e
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr
Existe algum tipo de tabela verdade que eu poderia usar para verificar isso?
Respostas:
And
tem precedência sobreOr
, portanto, mesmo quea <=> a1 Or a2
não é o mesmo que
porque isso seria executado como
e o que você deseja, para torná-los iguais, é o seguinte (usando parênteses para substituir regras de precedência):
Aqui está um exemplo para ilustrar:
Para quem gosta de consultar referências (em ordem alfabética):
fonte
AND
, em seguida,OR
a precedência é parte do padrão 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
Vou adicionar 2 pontos:
Portanto, as 2 expressões simplesmente não são iguais.
Portanto, quando você quebra a cláusula IN, divide os ORs seriais e altera a precedência.
fonte
Você pode usar parênteses para substituir regras de precedência.
fonte
Consulta para mostrar uma tabela verdade de expressão booleana de 3 variáveis:
Resultados para
(A=1) OR (B=1) AND (C=1)
:Os resultados para
(A=1) OR ( (B=1) AND (C=1) )
são os mesmos.Resultados para
( (A=1) OR (B=1) ) AND (C=1)
:fonte