Два утверждения ниже эквивалентны?
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr
и
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr
Есть ли какая-то таблица истинности, которую я мог бы использовать, чтобы проверить это?
Ответы:
And
имеет приоритет надOr
, поэтому, даже еслиa <=> a1 Or a2
это не то же самое, что
потому что это будет выполнено как
и то, что вы хотите, чтобы сделать их одинаковыми, заключается в следующем (использование скобок для переопределения правил приоритета):
Вот пример для иллюстрации:
Для тех, кто любит обращаться за рекомендациями (в алфавитном порядке):
источник
AND
тогдаOR
приоритет является частью стандарта 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
Я добавлю 2 балла:
Итак, 2 выражения просто не равны.
Таким образом, когда вы разбиваете предложение IN, вы разделяете последовательные ИЛИ и меняете приоритет.
источник
Вы можете использовать скобки, чтобы переопределить правила приоритета.
источник
Запрос, чтобы показать таблицу истинности логического выражения с 3 переменными:
Результаты для
(A=1) OR (B=1) AND (C=1)
:Результаты для
(A=1) OR ( (B=1) AND (C=1) )
одинаковы.Результаты для
( (A=1) OR (B=1) ) AND (C=1)
:источник