Иллюстрированный самоучитель по PostgreSQL

Приоритет операторов

При работе с большими выражениями, содержащими несколько операторов, полезно знать, в каком порядке выполняются операторы в PostgreSQL. Было бы неправильно полагать, что операторы выполняются слева направо в порядке их следования в выражении. При неправильном понимании этой темы нередко возникают нежелательные побочные эффекты (листинг 5.18).

Листинг 5.18. Приоритет операторов.

booktown=# SELECT 60 + 12 * 5
AS "sixty plus twelve times five",
booktown-# 12 + 60 * 5
AS "twelve plus sixty times five";
sixty plus twelve times five |
twelve plus sixty times five
120 | 312
(1 row)

Как видно из листинга, результат выражения без круглых скобок, обеспечивающих нужный порядок выполнения операторов, в значительной степени зависит от порядка следования операндов. В приведенном примере первым всегда выполняется оператор умножения (несмотря на то, что оператор + расположен левее).

В табл. 5.8 перечислены группы операторов PostgreSQL в порядке убывания их приоритета.

Таблица 5.8. Приоритет операторов SQL.

Оператор Синтаксис Описание
:: значение::тип Явное преобразование типа
[ ] значение [индекс] Индексация элемента массива
, таблица, поле Разделитель имен таблицы и столбца
- -значение Унарный минус
^ основание ^ степень Возведение в степень
* / % значение1 * значение2 Умножение, деление и остаток
+ - значение1 + значение2 Сложение и вычитание
IS значение IS признак Сравнение с true или false
IS NULL значение IS NULL Сравнение с NULL
IS NOT NULL значение IS NOT NULL Проверка несовпадения с NULL
Прочее   Все остальные пользовательские и встроенные операторы, не входящие ни в одну из категорий
IN значение IN набор Проверка принадлежности к заданному набору
BETWEEN значение BETWEEN a AND b Проверка принадлежности к интервалу [а .b]
LIKE, ILIKE строка LIKE, шаблон Проверка совпадения шаблона со строкой
<> < › = значение1 < значение2 Сравнения по критериям "меньше", "больше", "меньше либо равно", "больше либо равно"
= значение1 = значение2 Проверка равенства
NOT NOT значение Логическое отрицание
AND значение1 AND значение2 Логическая конъюнкция
OR значение1 OR значение2 Логическая дизъюнкция

Примечание
Приоритет операторов, приведенных в табл. 5.8, распространяется на пользовательские операторы, обозначения которых совпадают с обозначениями встроенных операторов. Например, если вы определите собственный оператор + для своего типа данных, он будет обладать таким же приоритетом, как встроенный оператор +, независимо от своего предназначения
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.