9.3. Математические функции и операторы

Математические операторы определены для множества типов PostgreSQL. Как работают эти операции с типами, для которых нет стандартных соглашений о математических действиях (например, с типами даты/времени), мы опишем в последующих разделах.

В Таблице 9-2 перечислены все доступные математические операторы.

Таблица 9-2. Математические операторы

ОператорОписаниеПримерРезультат
+ сложение 2 + 3 5
- вычитание 2 - 3 -1
* умножение 2 * 3 6
/ деление (при целочисленном делении остаток отбрасывается) 4 / 2 2
% остаток от деления 5 % 4 1
^ возведение в степень (вычисляется слева направо) 2.0 ^ 3.0 8
|/ квадратный корень |/ 25.0 5
||/ кубический корень ||/ 27.0 3
! факториал 5 ! 120
!! факториал (префиксная форма) !! 5 120
@ модуль числа (абсолютное значение) @ -5.0 5
& битовый AND 91 & 15 11
| битовый OR 32 | 3 35
# битовый XOR 17 # 5 20
~ битовый NOT ~1 -2
<< битовый сдвиг влево 1 << 4 16
>> битовый сдвиг вправо 8 >> 2 2

Битовые операторы работают только с целостными типами данных, тогда как другие и работают и с остальными числовыми типами. Битовые операции также работают с битовыми строками bit и bit varying, как показано в Таблице 9-11.

В Таблице 9-3 перечислены все существующие математические функции. Сокращение dp в ней обозначает тип double precision (плавающее с двойной точностью). Многие из этих функций имеют несколько форм с разными типами аргументов. За исключением случаев, где это указано явно, любая форма функции возвращает результат того же типа, что и аргумент. Функции, работающие с данными double precision, в массе своей используют реализации из системных библиотек сервера, поэтому точность и поведение в граничных случаях может зависеть от системы сервера.

Таблица 9-3. Математические функции

ФункцияТип результатаОписаниеПримерРезультат
abs(x) тип аргументамодуль числа (абсолютное значение) abs(-17.4) 17.4
cbrt(dp) dp кубический корень cbrt(27.0) 3
ceil(dp или numeric) тип аргументаближайшее целое, большее или равное аргументу ceil(-42.8) -42
ceiling(dp или numeric) тип аргументаближайшее целое, большее или равное аргументу (равнозначно ceil) ceiling(-95.3) -95
degrees(dp) dp преобразование радианов в градусы degrees(0.5) 28.6478897565​412
div(y numeric, x numeric) numeric целочисленный результат y/x div(9,4) 2
exp(dp или numeric) тип аргументаэкспонента exp(1.0) 2.7182818284​5905
floor(dp или numeric) тип аргументаближайшее целое, меньшее или равное аргументу floor(-42.8) -43
ln(dp или numeric) тип аргументанатуральный логарифм ln(2.0) 0.6931471805​59945
log(dp или numeric) тип аргументалогарифм по основанию 10 log(100.0) 2
log(b numeric, x numeric) numeric логарифм по основанию b log(2.0, 64.0) 6.0000000000
mod(y, x) зависит от типов аргументовостаток от деления y/x mod(9,4) 1
pi() dp константа "π" pi() 3.1415926535​8979
power(a dp, b dp) dp a возводится в степень b power(9.0, 3.0) 729
power(a numeric, b numeric) numeric a возводится в степень b power(9.0, 3.0) 729
radians(dp) dp преобразование градусов в радианы radians(45.0) 0.7853981633​97448
round(dp или numeric) тип аргументаокругление до ближайшего целого round(42.4) 42
round(v numeric, s int) numeric округление v до s десятичных знаков round(42.4382, 2) 42.44
sign(dp или numeric) тип аргументазнак аргумента (-1, 0, +1) sign(-8.4) -1
sqrt(dp или numeric) тип аргументаквадратный корень sqrt(2.0) 1.4142135623​731
trunc(dp или numeric) тип аргументаокругление к нулю trunc(42.8) 42
trunc(v numeric, s int) numeric округление к 0 до s десятичных знаков trunc(42.4382, 2) 42.43
width_bucket(operand dp, b1 dp, b2 dp, count int) int возвращает номер группы, в которую попадёт operand в гистограмме с числом групп count равного размера, в диапазоне от b1 до b2; возвращает 0 или count+1, если операнд лежит вне диапазона width_bucket(5.35, 0.024, 10.06, 5) 3
width_bucket(operand numeric, b1 numeric, b2 numeric, count int) int возвращает номер группы, в которую попадёт operand в гистограмме с числом групп count равного размера, в диапазоне от b1 до b2; возвращает 0 или count+1, если операнд лежит вне диапазона width_bucket(5.35, 0.024, 10.06, 5) 3
width_bucket(operand anyelement, thresholds anyarray) int возвращает номер группы, в которую попадёт operand (группы определяются нижними границами, передаваемыми в thresholds); возвращает 0, если операнд оказывается левее нижней границы; массив thresholds должен быть отсортирован по возрастанию, иначе будут получены неожиданные результаты width_bucket(now(), array['yesterday', 'today', 'tomorrow']::timestamptz[]) 2

В Таблице 9-4 перечислены все функции для генерации случайных чисел.

Таблица 9-4. Случайные функции

ФункцияТип результатаОписание
random() dp случайное число в диапазоне 0.0 <= x < 1.0
setseed(dp) void задаёт отправную точку для последующих вызовов random() (значение между -1.0 и 1.0, включая границы)

Характеристики значений, возвращаемых функцией random() зависят от системы. Для применения в криптографии они непригодны; альтернативы описаны в pgcrypto.

Наконец, в Таблице 9-5 перечислены все тригонометрические функции. Все эти функции принимают аргументы и возвращают значения типа double precision. Аргументы тригонометрических функций выражаются в радианах. Также в радианах выражаются результаты обратных функций. Для преобразования единиц могут быть полезны упомянутые выше функции radians() и degrees().

Таблица 9-5. Тригонометрические функции

ФункцияОписание
acos(x) арккосинус
asin(x) арксинус
atan(x) арктангенс
atan2(y, x) арктангенс y/x
cos(x) косинус
cot(x) котангенс
sin(x) синус
tan(x) тангенс