Числовые операторы
Числовые операторы PostgreSQL делятся на три категории.
- Математические операторы выполняют математическую операцию с одним или двумя операндами и возвращают значение числового типа.
- Операторы сравнения проверяют заданное соотношение между двумя числовыми величинами (например, что одна величина больше другой) и возвращают результат проверки в виде типа boolean.
- Двоичные операторы работают на уровне отдельных битов, то есть единиц и нулей в двоичном представлении.
Ниже приведены более подробные описания по всем трем категориям.
Математические операторы
Математические операторы используются в целевых списках, в секции WHERE команды SELECT и вообще везде, где встречаются числовые данные.
В табл. 5.4 перечислены математические операторы PostgreSQL и приведены
примеры их использования.
Таблица 5.4. Математические операторы
Оператор | Синтаксис | Описание |
+ |
а + b |
Суммирование числовых величин а и b |
- |
а - Ь |
Вычитание числовой величины b из а |
* |
а * b |
Умножение числовых величин а и b |
/ |
а / b |
Деление числовой величины а на b |
% |
а % b |
Остаток от деления а на b |
А |
а - b |
Возведение а в степень b |
|/ |
!/ а |
Квадратный корень из а |
II/ |
||/ а |
Кубический корень из b |
1 |
а! |
Факториал а |
! 1 |
!! а |
Факториал а (отличается от постфиксного оператора только расположением) |
@ |
@ а |
Модуль (абсолютное значение) а |
Пример использования математических операторов в целевом списке приведен в листинге 5.9. Оператор / используется для вычисления удельной прибыли по каждой книги. Частное от деления преобразуется к типу numeri с с усечением до двух цифр в дробной части. Наконец, из результата вычитается целочисленная константа 1, чтобы результат выражался в процентах свыше 100.
Листинг 5.9. Использование математических операторов
booktown=# SELECT isbn,
booktown-# (retail / cost)::numeric(3, 2) - 1 AS margin
booktown-# FROM stock
booktowri-# ORDER BY margin DESC
booktown-# LIMIT 4;
isbn | margin
0451457994 | 0.35
0760720002 | 0.33
0451198492 0.30
0441172717 | 0.29
(4 rows)
Обратите внимание на определение временного псевдонима margin при помощи ключевого слова AS. Псевдоним представляет собой временное имя, которое существует только во время обработки запроса.
Операторы сравнения
Операторы сравнения работают со значениями таких типов, как integer или text, но всегда возвращают результат типа boo"! ean. Они часто встречаются в секции WHERE, но могут использоваться в любом контексте, в котором действителен тип boolean. Операторы сравнения PostgreSQL перечислены в табл. 5.5.
Таблица 5.5. Операторы сравнения
Оператор | Описание |
< |
Возвращает true, если левое значение меньше правого |
> |
Возвращает true, если левое значение больше правого |
<= |
Возвращает true, если левое значение меньше правого или равно ему |
>= |
Возвращает true, если левое значение больше правого или равно ему |
= |
Возвращает true, если левое значение равно правому |
<> или ! = |
Возвращает true, если левое значение не равно правому |
ПРИМЕЧАНИЕ
Оператор <> существует как синоним оператора != для обеспечения совместимости с другими реализациями СУБД на базе SQL. Работают эти операторы одинаково.
Пример команды, в которой используются операторы сравнения, приведен в листинге 5.10.
Листинг 5.10. Использование операторов сравнения
booktown=# SELECT isbn, stock booktown-# FROM stock
booktown-# WHERE retail <= 25
booktown-# AND stock != 0:
isbn | stock
0441172717 | 77
0590445065 | 10
0679803335 | 18
0760720002 | 28
09296C5942 | 25
1885418035 | 77
(6 rows)
Сравнение с использованием ключевых слов
Ключевое слово BETWEEN (также иногда называемое оператором) позволяет проверить, входит ли значение в некоторый интервал. Например, команда SELECT, приведенная в листинге 5.11, находит книги, цена которых находится в интервале от 10 до 17 долларов.
Листинг 5.11. Ключевое слово BETWEEN
booktown=# SELECT isbn FROM stock
booktown-# WHERE cost BETWEEN 10 AND 17;
isbn
0394800753 0441172717 0451457994
(3 rows)
Аналогичного результата можно добиться и при помощи оператора <= в сочетании с оператором >= (листинг 5.12).
Листинг 5.12. Имитация ключевого слова BETWEEN при помощи операторов
booktown=# SELECT isbn FROM stock
booktown-# WHERE cost >= 10 AND cost <= 17; isbn
0394800753 0441172717 0451457994
(3 rows)
В варианте с ключевым словом BETWEEN команда выглядит более понятной. Впрочем, для PostgreSQL оба варианта эквивалентны, поэтому выбор зависит от личных предпочтений программиста.
Двоичные операторы
Двоичные операторы выполняют поразрядные операции с битовыми последовательностями или целыми числами, что обычно приводит к изменению их значений. Двоичные операторы PostgreSQL перечислены в табл. 5.6.
Таблица 5.6. Двоичные операторы
Оператор | Синтаксис | Описание |
& |
а & b |
Поразрядная конъюнкция двоичных представлений а и b (которые могут быть заданы в виде целых чисел) |
1 |
а | b |
Поразрядная дизъюнкция двоичных представлений а и b (которые могут быть заданы в виде целых чисел) |
f |
а # b |
Поразрядная операция исключающей дизъюнкции двоичных представлений а и b (которые могут быть заданы в виде целых чисел) |
- |
- b |
Поразрядное отрицание, возвращает инвертированную битовую последовательность b |
« |
b « n |
Сдвиг b влево на n разрядов |
» |
b » n |
Сдвиг b вправо на n разрядов |
В листинге 5.13 приведен пример сдвига числа и его двоичного представления на два разряда вправо оператором ». Кроме того, в нем используется функция преобразования битовой последовательности в целочисленный тип bitten nt4(), описанная в разделе «Функции».
Листинг 5.13. Сдвиг битовых последовательностей
booktown=# SELECT b'1000' » 2 AS "8 shifted right".
booktown-# Mttoint4(b'1000' » 2) AS integer.
booktown-# 8 » 2 AS likewise;
8 shifted right | integer | likewise
0010 I 2 I 2
(1 row)
ПРИМЕЧАНИЕ
При сдвиге битовых последовательностей исходная длина строки не изменяется, а разряды, выходящие за левый или правый край последовательности, отсекаются. При использовании операторов &, | или # битовые операнды должны иметь одинаковую длину.