Приоритет оператора логики SQL: и и или

Являются ли эти два утверждения ниже эквивалентными?

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

Есть ли какая-нибудь таблица истинности, которую я мог бы использовать, чтобы проверить это?

142 голоса | спросил nc. 7 AM000000120000002231 2009, 00:15:22

4 ответа


0

And имеет приоритет над Or и даже если a <=> a1 Or a2

Where a And b 

не совпадает с

Where a1 Or a2 And b,

потому что это будет выполнено как

Where a1 Or (a2 And b)

и то, что вы хотите, чтобы сделать их одинаковыми, это

 Where (a1 Or a2) And b

Вот пример для иллюстрации:

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 -- outputs T
Select Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- outputs F

Для тех, кто любит обращаться к ссылкам (в алфавитном порядке):

ответил Charles Bretana 7 AM000000120000005031 2009, 00:19:50
0

Я добавлю 2 балла:

  • "IN" - это, по сути, последовательное ИЛИ с круглыми скобками вокруг них
  • И имеет приоритет перед ИЛИ на каждом языке, который я знаю

Итак, 2 выражения просто не равны.

WHERE some_col in (1,2,3,4,5) AND some_other_expr
--to the optimiser is this
WHERE
     (
     some_col = 1 OR
     some_col = 2 OR 
     some_col = 3 OR 
     some_col = 4 OR 
     some_col = 5
     )
     AND
     some_other_expr

Итак, когда вы разбиваете предложение IN, вы разделяете последовательные ИЛИ и меняете приоритет.

ответил gbn 7 AM00000090000005531 2009, 09:20:55
0
  1. Арифметические операторы
  2. Оператор конкатенации
  3. Условия сравнения
  4. [NOT] NULL, LIKE, [NOT] IN
  5. [НЕ] МЕЖДУ
  6. Не равно
  7. НЕ логическое условие
  8. И логическое условие
  9. ИЛИ логическое условие

Вы можете использовать скобки, чтобы переопределить правила приоритета.

ответил Yassine Abdul-Rahman 28 MaramFri, 28 Mar 2014 02:49:31 +04002014-03-28T02:49:31+04:0002 2014, 02:49:31
0

Запрос на отображение таблицы истинности булевых выражений с 3 переменными:

;WITH cteData AS
(SELECT 0 AS A, 0 AS B, 0 AS C
UNION ALL SELECT 0,0,1
UNION ALL SELECT 0,1,0
UNION ALL SELECT 0,1,1
UNION ALL SELECT 1,0,0
UNION ALL SELECT 1,0,1
UNION ALL SELECT 1,1,0
UNION ALL SELECT 1,1,1
)
SELECT cteData.*,
    CASE WHEN

(A=1) OR (B=1) AND (C=1)

    THEN 'True' ELSE 'False' END AS Result
FROM cteData

Результаты для (A=1) OR (B=1) AND (C=1):

A   B   C   Result
0   0   0   False
0   0   1   False
0   1   0   False
0   1   1   True
1   0   0   True
1   0   1   True
1   1   0   True
1   1   1   True

Результаты для (A=1) OR ( (B=1) AND (C=1) ) совпадают.

Результаты для ( (A=1) OR (B=1) ) AND (C=1):

A   B   C   Result
0   0   0   False
0   0   1   False
0   1   0   False
0   1   1   True
1   0   0   False
1   0   1   True
1   1   0   False
1   1   1   True
ответил AjV Jsy 18 J0000006Europe/Moscow 2015, 17:29:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132