Czy poniższe dwa stwierdzenia są równoważne?
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr
i
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr
Czy istnieje jakaś tabela prawdy, której mógłbym użyć, aby to zweryfikować?
Odpowiedzi:
And
ma pierwszeństwo przedOr
, więc nawet jeślia <=> a1 Or a2
to nie to samo co
ponieważ zostałby wykonany jako
i to, czego chcesz, aby były takie same, jest następujące (używając nawiasów, aby zastąpić reguły pierwszeństwa):
Oto przykład ilustrujący:
Dla tych, którzy lubią sprawdzać referencje (w kolejności alfabetycznej):
źródło
AND
toOR
pierwszeństwo jest częścią standardu 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
Dodam 2 punkty:
Zatem te dwa wyrażenia po prostu nie są równe.
Tak więc, kiedy łamiesz klauzulę IN, dzielisz seryjne OR i zmieniasz priorytet.
źródło
Możesz użyć nawiasów, aby zastąpić reguły pierwszeństwa.
źródło
Zapytanie pokazujące tabelę prawdy wyrażenia logicznego z 3 zmiennymi:
Wyniki dla
(A=1) OR (B=1) AND (C=1)
:Wyniki dla
(A=1) OR ( (B=1) AND (C=1) )
są takie same.Wyniki dla
( (A=1) OR (B=1) ) AND (C=1)
:źródło