Самоучитель по SQL-сервер в Linux



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

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

Оператор

Синтаксис

Описание

 

значение: : тип

Явное преобразование типа

[ ]

значение^ индекс]

Индексация элемента массива

 

таблица, поле

Разделитель имен таблицы и столбца

-

-значение

Унарный минус

А

основание * степень

Возведение в степень

* / %

значение! * значение2

Умножение, деление и остаток

+ -

значение! + значение2

Сложение и вычитание

IS

значение IS признак

Сравнение с true или false

IS NULL

значение IS NULL

Сравнение с NULL

IS NOT NULL

значение IS NOT NULL

Проверка несовпадения с NULL

Прочее

Все остальные пользовательские и встроенные операторы, не входящие ни в одну из категорий

IN

значение IN набор

Проверка принадлежности к заданному набору

BETWEEN

значение BETWEEN a AND b

Проверка принадлежности к интервалу [а. Ь]

LIKE, ILIKE

строка LIKE, шаблон

Проверка совпадения шаблона со строкой

<><=>=

значение! < значение2

Сравнения по критериям «меньше», «больше», «меньше либо равно», «больше либо равно»

=

значение! = значение2

Проверка равенства

NOT

NOT значение

Логическое отрицание

AND

значение! AND значение2

Логическая конъюнкция

OR

значение! OR значение2

Логическая дизъюнкция

ПРИМЕЧАНИЕ

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