Приоритет операторов
При работе с большими выражениями, содержащими несколько операторов, полезно знать, в каком порядке выполняются операторы в 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, распространяется на пользовательские операторы, обозначения которых совпадают с обозначениями встроенных операторов. Например, если вы определите собственный оператор + для своего типа данных, он будет обладать таким же приоритетом, как встроенный оператор +, независимо от своего предназначения.
