Поделиться через


Приоритет логических операторов

При использовании в инструкции нескольких логических операторов первым вычисляется NOT, затем AND и, наконец, OR. Арифметические и побитовые операторы выполняются до логических.

В следующем примере условие цвета относится к модели продукта 21, но не к модели продукта 20, так как у оператора AND приоритет над оператором OR.

USE AdventureWorks;
GO
SELECT ProductID, ProductModelID
FROM AdventureWorks.Production.Product
WHERE ProductModelID = 20 OR ProductModelID = 21
  AND Color = 'Red'

Можно изменить смысл запроса, добавляя скобки, чтобы добиться вычисления OR сначала. В следующем запросе будут найдены модели 20 и 21 красного цвета.

SELECT ProductID, ProductModelID
FROM AdventureWorks.Production.Product
WHERE (ProductModelID = 20 OR ProductModelID = 21)
  AND Color = 'Red'

С помощью скобок, даже если они не требуются, можно улучшить читаемость запросов и уменьшить вероятность совершения незаметной ошибки из-за приоритета операторов. Использование скобок практически не влияет на производительность. Следующий пример более понятен, чем исходный, хотя синтаксически они равноправны.

SELECT ProductID, ProductModelID
FROM AdventureWorks.Production.Product
WHERE ProductModelID = 20 OR (ProductModelID = 21
  AND Color = 'Red')