Операторы и функции
В этой главе рассматриваются операторы и функции PostgreSQL, то есть специальные символы и идентификаторы, предназначенные для модификации и сравнения данных в командах SQL. Результаты этих операций находят разнообразное применение, от обновления существующих записей в базе данных до ограничения результатов выборки по определенному критерию.
В PostgreSQL поддерживаются стандартные операторы и функции SQL, определенные в стандартах ANSI/ISO, — математические операторы, основные функции форматирования текста, выделение компонентов даты/времени и т. д. Кроме того, в PostgreSQL реализованы многочисленные нестандартные расширения, в том числе операторы поиска по регулярным выражениям и универсальная функция форматирования данных to_char().
Ниже описаны встроенные операторы и функции. Одной из замечательных особенностей языка PostgreSQL является возможность его расширения в этой области. Когда вы освоите стандартные операторы и функции, вероятно, вам захочется определить свои собственные. Эта тема рассматривается в главе 7.
Операторы
В главе 3 операторы SQL определялись как лексемы, предназначенные для выполнения операций с константами и идентификаторами и возвращающие результаты этих операций. Некоторые ключевые слова SQL тоже считаются операторами из-за воздействия на данные в командах SQL. В этом разделе термином «операторы» будут обозначаться как специальные символы, так и ключевые слова. Действия, выполняемые оператором, зависят от контекста его применения. Область применения операторов чрезвычайно широка, от выполнения математических операций и конкатенации строк до разнообразных сравнений. В следующем подразделе описываются общие правила применения операторов SQL, а далее подробно рассматриваются некоторые важнейшие категории операторов:
строковые операторы; числовые операторы; логические операторы.ПРИМЕЧАНИЕ
Самый «свежий» и наиболее полный список операторов PostgreSQL выводится в psql командой \do. Помните, что многие из перечисленных операторов существуют только в PostgreSQL и могут не поддерживаться в других СУБД на базе SQL.
После описания различных категорий операторов приводится информация о роли псевдозначений NULL в выражениях и о порядке выполнения операторов.
Правила использования операторов
Оператор работает с одним операндом или с двумя операндами. Большинство операторов работает с двумя операндами, между которыми ставится сам оператор (например, а-b). Такие операторы называются бинарными. Операторы, работающие с одним операндом, называются унарными; в этом случае оператор либо предшествует операнду, либо следует за ним (например, знак @ перед значением является унарным оператором, возвращающим модуль числа).
Некоторые операторы имеют несколько интерпретаций в зависимости от типа данных, к которым они применяются. С другой стороны, часть операторов не имеет смысла для некоторых типов данных (дополнительная информация о типах данных PostgreSQL приведена в главе 3).
Например, оператор сложения (+) может использоваться для суммирования двух целочисленных величии, но он не может прибавить целое число к текстовой строке. Считается, что такой вариант использования оператора дает неопределенный результат и потому является недопустимым. При этом сам оператор (в данном случае +) опознается нормально, но PostgreSQL выводит сообщение об ошибке (вроде того, что приведено в листинге 5.2).
Для примера рассмотрим таблицу authors, связывающую имена авторов с числовыми кодами.
Таблица "authors"
Атрибут | Тип | Модификатор
id | integer not null
lastjiame j text firstjname 1 text
Индекс: authors_pkey
Код автора id относится к типу integer (4-байтовое целое), а фамилия автора — к типу text. Поскольку поле id относится к числовому типу, оно может использоваться в качестве операнда математического оператора с другим числовым значением.
В листинге 5.1 приведен пример правильного использования оператора сложения (+).
Листинг 5.1. Правильное использование математического оператора
booktown=# SELECT id 1 AS id_p1us_one. 1ast_name
booktown-# FROM authors
booktown-# ORDER BY id DESC LIMIT 5;
id_plus_one j last_name
25042 Bianco 15991 | Bourgeois
7807 | Christiansen
7806 | Lutz
4157 I King
(5 rows)
Попытка сложения несовместимых типов продемонстрирована в листинге 5.2.
Листинг 5.2. Неверное использование операторов
booktown=# SELECT id + lastjiame AS mistake
booktown-# FROM authors:
ERROR: Unable to identify an operator '+' for types 'int4' and 'text' You will have to retype this query using an explicit cast
К счастью, в сообщениях о недопустимом использовании операторов в PostgreSQL указывается причина ошибки. Эта информация поможет вам устранить ошибку и внести необходимые исправления в команду.
Строковые операторы
В PostgreSQL существует обширный набор строковых операторов для выполнения различных действий, от простой конкатенации текста и сравнения строк до поиска по регулярным выражениям. Строковые операторы работают с типами char, varchar, а также с собственным типом PostgreSQL text.
Ниже описаны основные операторы сравнения и конкатенации, а также реализация операторов регулярных выражений с учетом и без учета регистра символов.
Базовые операторы сравнения
Базовые операторы сравнения строк и конкатенации, поддерживаемые в PostgreSQL, перечислены в табл. 5.1.
ПРИМЕЧАНИЕ
Ключевые слова LIKE и ILIKE, приводящие к вызову функции 11ke(), иногда называются операторами сравнения строк. Эти ключевые слова рассматриваются ниже в разделе «Функции».
Таблица 5.1. Базовые строковые операторы
Оператор | Синтаксис | Описание |
= | 'строка!' = ' строка2' | Возвращает true, если первая строка точно совпадает со второй |
! = |
'строка!' != ' строка2' |
Возвращает true, если первая строка не совпадает со второй |
о |
'строка!' <> ' строка2' |
Идентичен оператору != |
< |
'строка!' < ' строка2' |
Возвращает true, если при лексикографической сортировке первая строка предшествует второй |
<= |
'строка!' <= ' строка2' |
Возвращает true, если при лексикографической сортировке первая строка предшествует второй или их значения совпадают |
> |
'строка!' > ' строка2' |
Возвращает true, если при лексикографической сортировке вторая строка предшествует первой |
>= |
'строка!' >= ' строка2' |
Возвращает true, если при лексикографической сортировке вторая строка предшествует первой или их значения совпадают |
Все операторы сравнения строк возвращают логическое значение (true или false). Лексикографическая сортировка, упоминаемая в табл. 5.1, последовательно сравнивает символы строк и определяет, какой из символов «больше» другого. Если начальные символы двух строк совпадают, проверяются следующие символы (слева направо). Перебор продолжается до тех пор, пока не будут найдены два различающихся символа. В этом алгоритме сортировки «больший» символ выбирается сравнением ASCII-кодов, как показывает следующий пример:
booktown=# SELECT letter, ascii(letter)
booktown-# FROM text_sorting
booktown-# ORDER BY letter ASC;
letter ascii
0 48
1 49
2 50
3 51
A 65
В 66
С 67
D 68
a 97
b 98
с 99
d I 100
(12 rows)
Если вы не уверены в порядке сортировки того или иного символа, воспользуйтесь функцией ascii О для получения его ASCII-кода (функция asci i () описана ниже в разделе «Функции»). В листинге 5.3 из таблицы books выбираются названия всех книг, первая буква которых при сортировке предшествует символу «D».
Листинг 5.3. Сравнение строк
booktown=# SELECT title FROM books
booktown=# WHERE substrCtitle, 1, 1) < 'D1;
title
2001: A Space Odyssey
Bartholomew and the Oobleck
(2 rows)
Конкатенация
Оператор конкатенации (11) играет очень важную роль при форматировании выходных данных. Как и все операторы, он может использоваться в командах SQL всюду, где могут использоваться константы. Допускается последовательная конкатенация строковых значений, для этого перечисляемые строковые константы или идентификаторы разделяются операторами 11.
Например, оператор конкатенации может использоваться в секции WHERE для фильтрации записей на основании сравнения с символьной строкой. Пример приведен в листинге 5.4.
Листинг 5.4. Конкатенация строк
booktown=# SELECT 'The Title: ' | title || ', by ' |
booktown-# first_name || ' ' II lastjiame AS bookjinfo
booktown-# FROM books NATURAL JOIN authors AS a (authorjd) LIMIT 3;
book_info
The Title: The Shining, by Stephen King
The Title: Dune, by Frank Herbert
The Title: 2001: A Space Odyssey, by Arthur C. Clarke
(3 rows)
Операторы регулярных выражений
Если обычного сравнения строк оказывается недостаточно, в PostgreSQL предусмотрены специальные операторы для поиска совпадений по регулярным выражениям. Регулярное выражение похоже на строковую константу, с которой сравнивается исходная строка, но некоторые символы (квадратные скобки, вертикальная черта, обратная косая черта и т. д.) при сравнении интерпретируются особым образом. Если вам доводилось работать с такими программами Unix, как sed, grep или perl, возможно, вы уже знакомы с синтаксисом регулярных выражений.
ПРИМЕЧАНИЕ
Общие сведения о регулярных выражениях приведены в книге Джеффри Фридла (Jeffrey Friedl) «Mastering Regular Expressions».
Регулярное выражение состоит из литералов и метасимволов (специальных символов). Обычно регулярные выражения могут совпадать с несколькими вариантами строковых значений. Пример приведен в листинге 5.5, где в таблице authors ищутся все имена (fi rstjiame), начинающиеся с символа А или Т.
Листинг 5.5. Поиск по регулярному выражению
booktown=# SELECT first_name, last_name
booktown-# FROM authors
booktown-# WHERE firstjiame - "AT1;
fi rstjiame lastjiame
Ariel Denham Tom Christiansen
Arthur C. | Clarke Andrew Brookins
Theodor Seuss j Geisel (5 rows)
Символ ~ в секции WHERE является оператором регулярного выражения, а само регулярное выражение задается строкой ЛА| ЛТ. В него входят специальные символы (метасимволы) л и |, а также литералы А и Т. Метасимволы регулярных выражений описаны ниже в этом пункте.
Важнейшее различие между функцией 11 ke() и операторами регулярных выражений заключается в том, что функция likeO ищет совпадение для всей строки, а операторы регулярных выражений ищут совпадение в произвольной позиции заданной строки, если только в самом регулярном выражении не указано обратное.
Операторы регулярных выражений перечислены в табл. 5.2. Их операндами всегда являются строка с регулярным выражением и текст, в котором ищется совпадение (идентификатор или константа). Все операторы регулярных выражении
возвращают результат логического типа, интерпретация которого зависит от специфики самого оператора.
Таблица 5.2. Операторы регулярных выражений
Оператор | Синтаксис | Описание |
- |
' строка' ~ ' выражение' |
Возвращает true, если в строке существует совпадение для регулярного выражения |
i ~ |
'строка' \- 'выражение' |
Возвращает true, если в строке нет совпадения для регулярного выражения |
~* |
' строка' ~* ' выражение' |
Возвращает true, если в строке существует совпадение для регулярного выражения (без учета регистра символов) |
|_* |
'строка' !-* 'выражение' |
Возвращает true, если в строке нет совпадения для регулярного выражения (без учета регистра символов) |
В табл. 5.3 перечислены метасимволы регулярных выражений. Как было указано выше, в регулярных выражениях эти символы интерпретируются особым образом.
Таблица 5.3. Метасимволы регулярных выражений
Символ | Синтаксис | Описание |
- |
^выражение |
Соответствует началу строки |
$ |
выражение$ |
Соответствует концу строки |
. | , | Соответствует одному символу |
[ ] |
[abc] |
Соответствует любому из символов, перечисленных в квадратных скобках |
Г] |
ГаЬс] |
Соответствует любому символу кроме символов, перечисленных в квадратных скобках |
[-] |
[a-z] |
Соответствует любому символу из интервала, заданного в квадратных скобках |
Г-] |
Га-z] |
Соответствует любому символу кроме символов из интервала, заданного в квадратных скобках |
7 |
а? |
Соответствует нулю экземпляров или одному экземпляру предшествующего символа или подвыражения |
* |
а* |
Соответствует нулю экземпляров или произвольному количеству экземпляров предшествующего символа или подвыражения |
+ |
а+ |
Соответствует одному и более экземпляров предшествующего символа или подвыражения |
1 |
выражение! \ выражение2 |
Соответствует левому или правому подвыражению |
( ) |
(выражение!) выражение2 |
Группировка подвыражений с явным определением приоритета выполняемых операций |
ПРИМЕЧАНИЕ
Литералы, совпадающие с метасимволами из табл. 5.3, должны экранироваться в строке двумя символами \ (например, знак $ представляется последовательностью \\$).
Регулярные выражения часто применяются для поиска подстрок в строках-литералах большего размера. При поиске соответствия с учетом регистра символов используется оператор -; с оператором -* регистр игнорируется. Примеры приведены в листинге 5.6.
Листинг 5.6. Простой поиск соответствия
booktown=# SELECT title FROM books
booktown-# WHERE title - 'The';
title
The Shining The Cat in the Hat The Velveteen Rabbit
The Tell-Tale Heart
(4 rows)
booktown=# SELECT title FROM books
booktown-f WHERE title -* 'The'; title
The Shining The Cat in the Hat Bartholomew and
the Oobleck Franklin in the Dark The Velveteen Rabbit
The Tell-Tale Heart
(6 rows)
Как видно из результатов, оператор ~* возвращает две дополнительные записи, поскольку выражение соответствует не только подстроке «the», но и любым модификациям в регистре символов этой подстроки (the, tHe, ThE и т. д.).
Если добавить в начало этого регулярного выражения символ л, оно будет соответствовать только подстроке «The», находящейся в начале исходного текста (листинг 5.7).
Конструкция . * обозначает любое количество произвольных символов до следующего подвыражения. В данном примере этим подвыражением является пара строк в круглых скобках (rabbit и heart), разделенных символом |, что соответствует любой из перечисленных строк.
Листинг 5.7. Нетривиальный поиск соответствия
booktown=f SELECT title FROM books
booktown-# WHERE title -* IAThe.*(rabbit|heart)';
title
The Velveteen Rabbit The Tell-Tale Heart
(2 rows)
Выражение AThe.*(rabbit|heart) означает следующее: соответствие находится лишь в том случае, если строка начинается с символов «The», далее идет любое количество произвольных символов, а после них следует либо подстрока «rabbit», либо подстрока «heart». Оператор ~* (вместо оператора ~) производит сравнение без учета регистра символов.
В листинге 5.8 приведен пример еще более сложного регулярного выражения.
Листинг 5.8. Сложный поиск соответствия
booktown=# SELECT title FROM books
booktown-# WHERE title ~* 'rt.*[ri]t) | (ingJjune$)' :
title
The Shining Dune
The Velveteen Rabbit The Tell-Tale Heart
(4 rows)
booktown=#
На первый взгляд регулярное выражение в листинге 5.8 выглядит устрашающе. Но если разбить его на элементы, становится видно, что оно состоит из двух выражений в круглых скобках, разделенных символом [.Таким образом, соответствие будет найдено, если хотя бы одно из этих выражений указывает на значение в поле title.
Продолжая анализ выражения, мы видим, что подвыражение слева от символа | состоит из следующих элементов (слева направо): метасимвол л, за которым следует символ t, затем последовательность .* и пара квадратных скобок с символами г и i, за которыми следует символ t. В переводе на русский язык это означает, что соответствие должно начинаться с буквы t, за которой следует ноль или более символов, пока не будет встречена буква г или 1, после которой немедленно следует буква t. Если хотя бы одно из этих условий не соблюдается, соответствия нет.
Выражение в правой части устроено проще. Оно состоит из двух литералов ing и une, разделенных очередным символом , причем за каждым литералом следует символ $. В переводе это означает, что совпадение должно заканчиваться подстрокой Ing или une. При выполнении любого (благодаря символу |) из этих условий соответствие считается найденным.
Числовые операторы
Числовые операторы 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)
ПРИМЕЧАНИЕ
При сдвиге битовых последовательностей исходная длина строки не изменяется, а разряды, выходящие за левый или правый край последовательности, отсекаются. При использовании операторов &, | или # битовые операнды должны иметь одинаковую длину.
Логические операторы
Ключевые слова AND, OR и NOT являются логическими (булевыми) операторами PostgreSQL. Обычно они используются для операций с логическими условиями в командах SQL, особенно в секциях WHERE и HAVING.
В табл. 5.7 приведена сводка результатов, возвращаемых логическими операторами AND, OR и NOT для всех возможных сочетаний операндов (true, false и NULL).
Таблица 5.7. Операторы AND, OR и NOT
а | b | aANDb | aORb | NOT a | NOTb |
true |
true |
true |
true |
false |
false |
true |
false |
false |
true |
false |
true |
true |
NULL |
NULL |
true |
false |
NULL |
false |
false |
false |
false |
true |
true |
false |
NULL |
false |
NULL |
true |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
В листинге 5.14 приведена пара запросов с ключевыми словами OR и AND, объединяющими условия выборки записей. Первый запрос возвращает информацию о книгах, которые стоят больше 30 долларов или отсутствуют на складе. Как видно из итогового набора, для возвращения записи должно выполняться одно или оба условия.
Во втором запросе те же условия объединяются ключевым словом AND. В результате записи проходят более жесткий отбор, поскольку должны выполняться сразу оба критерия. Итоговый набор состоит всего из одной записи для книги, которая стоит дороже 30 долларов и отсутствует на складе.
Листинг 5.14. Объединение условий с использованием логических операторов
booktown=# SELECT isbn, cost, stock
booktown-# FROM stock
booktown-# WHERE cost > 30
booktown-# OR stock = 0:
Isbn cost | stock
0394900014 23.00 | 0
044100590X | 36.00 | 89
0451198492 | 36.00 | 0
0451457994 17.00 j 0 (4 rows)
booktown=# SELECT Isbn, cost, stock
booktown-# FROM stock
booktown-# WHERE cost > 30
booktown-# AND stock = 0;
Isbn | cost stock
0451198492 36.00 0
(1 row)
Операторы и NULL
Если таблица содержит значения NULL, можно воспользоваться специальными операторами сравнения, чтобы учесть поля NULL при выборке или игнорировать их. Конструкция IS NULL проверяет, содержит ли поле значение NULL. Обратное условие проверяется конструкцией NOT IS NULL.
В листинге 5.15 конструкция IS NULL используется для поиска авторов, у которых отсутствуют данные в поле f 1 rst_name.
Листинг 5.15. Проверка с использованием конструкции IS NULL
booktown=# SELECT lastjiame, firstjiame
booktown-l FROM authors
booktown-* WHERE firstjiame IS NULL;
lastjiame fi rstjname
Geisel
(1 row)
При сравнении команд в листингах 5.15 и 5.16 может показаться, что эти два варианта синтаксиса идентичны. Тем не менее между ними существует принципиальное различие.
Листинг 5.16. Сравнение со значением NULL
booktown=# SELECT lastjiame, firstjiame
booktown-l FROM authors
booktown-f WHERE firstjiame = NULL:
lastjiame | fi rstjname
Geisel |
(1 row)
В PostgreSQL условие = NULL преобразуется в IS NULL, а условие != NULL преобразуется в IS NOT NULL. Это сделано только для совместимости с существующими клиентскими приложениями (например, Microsoft Access).
Тем не менее при сравнении значений с NULL вместо математических операторов = и != рекомендуется использовать конструкции IS NULL и NOT IS NULL. В настоящее время использование математических операторов = и != для сравнения со псевдозначениями NULL допускается ради совместимости с другими системами, но в будущем эта поддержка может быть ликвидирована, поскольку она не предусмотрена в стандарте SQL. По той же причине она не гарантирована в других СУБД на базе SQL.
Все остальные операторы сравнения для операнда NULL возвращают NULL, поскольку NULL никогда не бывает больше или меньше другой величины, отличной от NULL (листинг 5.17). NULL можно рассматривать как своего рода «черную дыру» в мире SQL — для этого псевдозначения ни один оператор сравнения (кроме IS NULL и специального оператора преобразования =) не возвращает true; NULL не может участвовать в операциях сложения, конкатенации и т. д.
Листинг 5.17. Операторы и псевдозначение NULL
booktown=# \pset null *nu11* Null display is
booktown=# SELECT 5 > NULL;
?column?
*null*
(1 row)
booktown=# SELECT NULL IS NULL;
? column?
t (1 row)
booktown=# SELECT NULL || 'Test'; ?column?
*null*
(1 row)
Приоритет операторов
При работе с большими выражениями, содержащими несколько операторов, полезно знать, в каком порядке выполняются операторы в 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, распространяется на пользовательские операторы, обозначения которых совпадают с обозначениями встроенных операторов. Например, если вы определите собственный оператор + для своего типа данных, он будет обладать таким же приоритетом, как встроенный оператор +, независимо от своего предназначения.
Функции
Функция представляет собой идентификатор, используемый в PostgreSQL для выполнения программных операций в командах SQL. Функции всегда возвращают одно значение, применяемое в команде SQL, из которой была вызвана функция. Происходящее отчасти напоминает возврат значения оператором, вызванным из запроса; более того, с технической точки зрения оператор представляет собой указатель на встроенную системную функцию. Таким образом, операторы можно рассматривать как удобную форму записи, упрощающую вызов системных функций.
Использование функций
При вызове функции в команде SQL указывается имя функции, после которого в круглых скобках перечисляются аргументы. Существует два основных стиля передачи аргументов. Стандартные функции SQL92 обычно реализуются так, что их аргументы разделяются специальными ключевыми словами SQL (такими, как FROM, FOR и USING). С другой стороны, функции в стиле PostgreSQL получают аргументы, разделенные запятыми (вероятно, программисту с опытом программирования на С этот способ покажется более привычным).
В качестве аргументов могут передаваться константы, допустимые идентификаторы или выражения. Интерпретация аргументов и их принадлежность к определенному типу данных полностью зависит от вызываемой функции. За именем функции практически всегда обязательно следуют круглые скобки, даже если при вызове не передаются аргументы.
функция_в_стиле_sq192 ( { аргумент \ КЛЮЧЕВОЕ_СЛОВО } [.:.] )
ipyHKuHz_Bj:THnej)gsql92 ( аргумент [, ...] )
ВНИМАНИЕ
Круглые скобки не обязательны только для функций SQL92 current_date, current_t1me и current_timestamp. В PostgreSQL эти функции также вызываются без круглых скобок, чтобы обеспечить совместимость со спецификацией SQL92.
Вызовы функции могут быть вложенными — при условии, что тип данных, возвращаемый внутренней функцией, совместим с типом соответствующего аргумента внешней функции. Допускается вложение вызовов на произвольную глубину:
имя_функции (имя_вложенной_функции (аргументы [. ... ] ) [. ...] )
В PostgreSQL существует множество стандартных функций, работающих со встроенными типами данных. Полный список функций выводится командой \df в клиенте psql. Кроме того, в PostgreSQL поддерживается возможность определения пользовательских функций при помощи команды CREATE FUNCTION. За дополнительной информацией обращайтесь к главе 7.
ПРИМЕЧАНИЕ
По умолчанию полям в целевом списке, значение которых определяется функцией, назначается синоним в виде имени функции без круглых скобок и без аргументов (например, to_char).
Математические функции
Математические функции PostgreSQL выполняют стандартные арифметические и тригонометрические операции и работают с разными типами данных. В большинстве случаев тип возвращаемого значения совпадает с типом аргументов функции. В табл. 5.9 приведена сводка основных математических функций PostgreSQL.
Таблица 5.9. Математические функции PostgreSQL
Функция |
Описание |
abs(x) |
Возвращает модуль (абсолютное значение) х |
acos(x) |
Возвращает арккосинус х |
asin(x) |
Возвращает арксинус х |
atan(x) |
Возвращает арктангенс х |
atan2(x.y) |
Возвращает арктангенс х/у |
cbrt(x) |
Возвращает кубический корень х |
ceil (x) |
Возвращает минимальное целое число, не меньшее х (округление в верхнюю сторону) |
cos(x) |
Возвращает косинус х |
cot(x) |
Возвращает котангенс х |
degrees(r) |
Возвращает количество градусов в г радиан |
exp(x) |
Возвращает константу е (2,71828...) в степени х |
floor(x) |
Возвращает максимальное целое число, не большее х (округление в нижнюю сторону) |
ln(x) |
Возвращает натуральный логарифм х (функция, обратная ехр(х)) |
log(b.x) |
Возвращает логарифм х по основанию b |
log(x) |
Возвращает десятичный логарифм х |
modtx.yj |
Возвращает остаток от деления х/у |
pi О |
Возвращает константу к (3,14159...) |
pow(x.y) |
Возвращает х в степени у |
radians(d) |
Возвращает количество радиан в d градусов |
ranaomO |
Возвращает псевдослучайное число в интервале от 0,0 до 1,0 |
round(x) |
Возвращает число х, округленное до ближайшего целого |
sin(x) |
Возвращает синус х |
sqrt(x) |
Возвращает квадратный корень х |
tan(x) |
Возвращает тангенс х |
trunc(x) |
Возвращает целую часть х |
trunc(x.s) |
Возвращает значение х, усеченное до s цифр в дробной части |
Ниже приведены более подробные описания всех функций, перечисленных в таблице, с указанием аргументов, типов данных и выполняемых действий. Хотя функция обычно принимает аргументы лишь одного типа, PostgreSQL при необходимости пытается привести переданные аргументы к нужному типу. Если попытка автоматического преобразования типа завершается неудачей, PostgreSQL выводит сообщение об ошибке и вы можете попытаться выполнить явное преобразование. Дополнительная информация о явном преобразовании типов приведена в главе 3.
abs(x)
Синтаксис:
abs(x)
Функция abs() получает один числовой аргумент х и возвращает его модуль, то есть расстояние до нуля. Положительные числа остаются без изменений, а отрицательные числа меняют знак.
Аргумент функции abs() может относиться к любому из числовых типов данных (numeric, bigint, small int, real или double precision). Тип возвращаемого значения совпадает с типом аргумента.
Пример
testdb=# SELECT abs(lOO) AS abs_positive.
testdb-# abs(-lOO) AS absjiegative:
abs_positive | absjiegative
100 100
(1 row)
acos()
Синтаксис:
acos(x)
Функция acos () возвращает арккосинус аргумента х, относящегося к типу doubl e precision и лежащему в интервале допустимых значений косинуса (от -1 до 1). Фактически является обратной по отношению к функции cos(). Результат представляет собой угол (в радианах) в интервале от 0 до я, выраженный типом double precision.
Пример
testdb=# SELECT acos(l). acos(O),
acos(-l). testdb-# acos(cosd)) AS inverse_example:
acos | acos | acos | inverse_example
0 | 1.5707963267949 | 3.14159265358979 |
(1 row)
asin()
Синтаксис:
asln(x)
Функция as1n() возвращает арксинус аргумента х, относящегося к типу double jrecisi on и лежащему в интервале допустимых значений синуса (от -1 до 1). Факти-lecKii является обратной по отношению к функции sin(). Результат представляет со-юй угол (в радианах) в интервале от -я/2 до л/2, выраженный типом doubl e preci s I on.
Пример
testdb=# SELECT asin(l), asin(O), asin(-l),
testdb-# asin(sind)) AS inverse_examp1e;
asin | asin [ asin [ lnverse_example
1.5707963267949 0 | -1.5707963267949 | 1
(1 row)
itan()
Синтаксис:
itan(x)
Функция atari О возвращает арктангенс аргумента х, относящегося к типу doubl e )reci slon. Фактически является обратной по отношению к функции tan(). Результат представляет собой угол (в радианах) в интервале от -л/2 де я/2, выраженный типом double precision.
Пример
testdb=# SELECT atan(l). atan(O). atan(-l),
testdb-# atan(tand)) AS inverse_example;
atan atan | atan | inverse_example
0.785398163397448 | 0 | -0.785398163397448 | 1
(1 row)
itan2()
Синтаксис:
3tari2(x.y)
По аналогии с функцией atan(), функция atan2() возвращает арктангенс, то есть угол (в радианах) в интервале от -я/2 до я/2, выраженный типом doubl e preci si on. Однако в отличие от atan() она получает два аргумента типа double precision вместо одного и возвращает арктангенс величины, полученной делением первого аргумента на второй.
В общем случае вызов функции atan2(x,y) эквивалентен вызову atan(x/y), но при передаче аргумента у=0 функции atan2() не происходит ошибки деления на ноль, как при вызове atan() для величины х/у. Если аргумент у равен нулю, функция atan2() возвращает я/2 для положительных значений х, -я/2 для отрицательных х и 0 для х=0.
Пример
testdb=# SELECT atan2(0, 1). atan2(l, 1),
testdb-# atanCO / 1) AS functionally.
testdb-# atand / 1) AS identical;
atan2 atan2 | functionally identical
0 i 0.785398163397448 | 0 | 0.785398163397448 (1 row)
testdb=# SELECT atan2(l, 0) AS positive_x.
testdb-# atan2(-l, 0) AS negative_x,
testdb-# atan2(0, 0) AS zero_x,
testdb-i pi() / 2 AS pi_over_two:
positive_x | negative_x | zero_x \ pi_over_two
1.5707963267949 | -1.5707963267949 | 0 | 1.5707963267949
(1 row)
cbrt()
Синтаксис:
cbrt()
Функция cbrt () получает один числовой аргумент х типа doubl e preci si on и возвращает кубический корень, также представленный типом double precision. Фактически является обратной по отношению к функции pow(), выполняющей возведение в третью степень.
Пример
testdb=# SELECT pow(2.0. 3) AS "two cubed".
testdb-# cbrt(8.0) AS "eight's cube root";
two cubed | eight's cube root
8 | 2
(1 row)
ceil()
Синтаксис:
ceil(x)
Функция cei 1 () получает один числовой аргумент х, относящийся к любому из числовых типов данных (numeric, bigint, smallint, real или double precision), и округляет его до минимального целого, не меньшего переданной величины. Целые числа остаются без изменений.
Пример
testdb=# SELECT ceil(1.0). ceil(1.1), ceil(1.5);
ceil | ceil ceil
1 | 2 | 2
(1 row)
COS()
Синтаксис:
COSU)
Функция cos О получает один аргумент х типа double precision, представляющий угол в радианах, и возвращает косинус этого угла в виде типа doubl e preci si on.
Пример
testdb=# SELECT cos (pi О) AS cosj>i.
testdb-# cos(O) AS cos_zero:
cos_pi | cos_zero
1 | 1
(1 row)
cot()
Синтаксис:
cot(x)
Функция cot() получает один аргумент х типа double precision, представляющий угол в радианах, и возвращает котангенс этого угла в виде типа doubl e preci s i on. Аргумент должен быть отличным от нуля.
Пример
testdb=# SELECT cot(l). cot(-l):
cot cot
0.642092615934331 | -0.642092615934331
(1 row)
degrees()
Синтаксис:
degrees(r)
Функция degreesO получает аргумент г типа double precision, представляющий угол в радианах, и преобразует его в градусы. Возвращаемое значение относится к типу double precision. Фактически функция degreesO является обратной по отношению к функции radians().
Пример
testdb=# SELECT degrees(acos(-D) AS half_circle.
testdb-# degrees(pi) * 2) AS ful1_circle:
half_circle | full_circle
180 | 360
(1 row)
exp()
Синтаксис:
exp(x)
Функция получает один аргумент х типа numeri с или doubl e preci si on и возвращает его экспоненту, то есть результат возведения константы е в заданную степень.
Пример
testdb=# SELECT exp(O.O) AS one.
testdb-# exp(l.O) AS e.
testdb-* exp(2.0) AS "e squared":
one I e I e squared
1 | 2.71828182845905 | 7.38905609893065
(1 row)
floor()
Синтаксис:
floor(x)
Функция f 1 оог() получает один аргумент х типа numeri с и округляет его до максимального целого, не большего переданной величины. Целые числа остаются без изменений.
Пример
testdb=# SELECT floor(l.O) AS one.
testdb-# floor(1.1) AS "one point one",
testdb-# floord.8) AS "one point eight";
one one point one one point eight
1 | 1 | 1
(1 row)
ln()
Синтаксис:
ln(x)
Функция ln(x) получает один аргумент х типа numeric или double precision и возвращает его натуральный логарифм. Фактически является обратной по отношению к функции ехр(). Эквивалентна вызову функции log() с передачей основания е.
Пример
testdb=# SELECT In(lO.O) AS naturaljog.
testdb-| log(expd.O). 10.0) AS naturaljog,
testdb-# In(expdO.O)) AS inverse_example:
naturaljog | naturaljog | inverse_example
2.30258509299405 | 2.30258509299404 | 10
(1 row)
log()
Синтаксис:
log(x) log(b.x)
Функция log() получает один или два аргумента типа numeric. Если передан один аргумент, возвращается его десятичный логарифм. Если переданы два аргумента, функция log(b.x) возвращает логарифм х по основанию Ь.
Пример
testdb=# SELECT log(12.0) AS logj.2.
testdb-# logdO. 12.0) AS logj.2.
testdb-# log(3, 12.0) AS "log 12. base 3";
logJ2 logJ2 log 12. base 3
1.07918124604762 | 1.0791812460 | 2.2618595071
(1 row)
mod()
Синтаксис:
mod(x.y)
Функция mocK) получает два аргумента х и у, относящихся к числовым типам numeric, Integer, smallint или bigint. Возвращаемое значение представляет собой остаток от деления х на у.
Пример
testdb=# SELECT mod(5. 5) AS no_remainder.
testdo-# mod(6, 5) AS remainder_one,
mod(19. 5) AS remainder_four;
no_remainder | rema1nder_one | remainder_four
0 | 1 | 4
(1 row)
pi()
Синтаксис:
pi()
Функция pi () вызывается без аргументов и возвращает константу п, примерно равную 3,14159265358978.
Пример
testdb=# SELECT pi() AS "the pi constant":
the pi constant
3.14159265358979
(1 row)
pow()
Синтаксис:
pow(x.y)
Функция pow() получает два аргумента х и у, относящихся к числовым типам numeri с или doubl e preci s i on. Возвращаемое значение представляет собой результат возведения х в степень у. Тип данных результата совпадает с типом переданных аргументов. Следует помнить, что аргументы должны содержать десятичную точку.
Пример
testdb=# SELECT pow(2.0, 3.0) AS "two cubed".
testdb-# pow(2.0, 2.0) AS "two squared".
testdb-# pow(2.0, 1.0) AS "just two";
two cubed | two squared just two
8 | 4 2
(1 row)
radlans()
Синтаксис:
radians(d)
Функция radians () получает аргумент d типа double precision, представляющий угол в градусах, и преобразует его в радианы. Возвращаемое значение относится к типу double precision. Фактически функция radiansO является обратной по отношению к функции degrees ().
Пример
testdb=# SELECT radians(180) AS ha1f_circle.
testdb-# radians(360) AS fu11_circle;
half_circle | full_cnrcle
3.14159265358979 | 6.28318530717959
(1 row)
random ()
Синтаксис:
randon ()
Функция random() вызывается без аргументов и возвращает псевдослучайное число типа double precision в интервале от 0,0 до 1,0. При каждом вызове randonK) генерируется новое значение, даже если функция вызывается несколько раз в одном запросе.
Обычно функция random() используется в сочетании с математическими операторами (например, + и *) для получения псевдослучайных чисел в заданном интервале и последующим вызовом одной из функций округления (roundC), trunc() и т. д.).
Пример
testdb=# SELECT randonK) AS natural random,
testdb-# round(randomO * 9) + I AS one_through_ten.
testdb-# truncC randonK) * 99) + 1 AS one_through_one_hundred:
natural_random | one_through_ten | one_through_one_hundred
0.478887704424042 | 2 | 37
(1 row)
round ()
Синтаксис:
round(x) round(x.s)
Функция roundO вызывается с одним или с двумя аргументами. Первый аргумент х относится к типу numeric или double precision и определяет округляемое число. Второй необязательный аргумент s относится к типу integer и определяет количество цифр в дробной части после округления. Тип возвращаемого значения совпадает с типом первого аргумента.
Если значение аргумента s больше количества цифр в дробной части х, недостающие позиции заполняются нулями.
Пример
testdb=# SELECT round(l.O) AS one,
testdb-# round(l.l) AS "one point one",
testdb | round(1.5) AS "one point five",
testdb-# roundd.8) AS "one point eight";
one | one point one |
one point five | one point eight
1 | 1 | 2 | 2
(1 row)
testdb=# SELECT round(1.4949. 1) AS one_digit_scale.
testdb-# roundd.4949, 3) AS three_digit_scale.
testdb-# roundd.4949, 10) AS ten_digit_scale.
testdb-# roundd.4949. 0) AS rounded;
one_digit_scale | three_digit_scale | ten_digit_scale rounded
1.5 1.495 | 1.4949000000 1
(1 row)
Sin()
Синтаксис:
Sin(x)
Функция si n () получает один аргумент х типа doubl e preci si on, представляющий угол в радианах, и возвращает синус этого угла в виде значения типа doubl e preci si on.
Пример
testdb=# SELECT sin(pi() / 4) AS quarter_pi,
testdb-# sin(pi() / 2) AS half_pi:
quarter_pi | half_pi
0.707106781186547 |
(1 row)
sqrt()
Синтаксис:
sqrt()
Функция sqrt() получает один числовой аргумент х типа double precision или lumeric и возвращает квадратный корень, при этом тип возвращаемого значения ювпадает с типом аргумента. Фактически является обратной по отношению к Ьункции pow(), выполняющей возведение во вторую степень.
Пример
estdb=# SELECT sqrt(2.0), sqrt(4.0),
estdb-# sqrt(pow(2.0, 2)) AS inverse_example:
sqrt | sqrt | inverse_exampl
1.4142135623731 2 | 2
(1 row)
tan()
Синтаксис:
tan(x)
Функция tan() получает один аргумент х типа doubl e preci si on, представляющий тол в радианах, и возвращает тангенс этого угла в виде значения типа doubl e preci s i on.
Пример
testdb=# SELECT tan(pi() / 8).
testdb-# tan(O): tan | tan
0.414213562373095 |
(1 row)
trunc()
Синтаксис:
trunc(x) trunc(x.s)
Функция trunc() вызывается с одним или с двумя аргументами. Первый аргумент х относится к типу numeric или double precision и определяет исходное число. Второй необязательный аргумент s относится к типу integer и определяет количество цифр в дробной части после усечения.
Если аргумент s не задан, отсекаются все цифры в дробной части числа. Если значение аргумента s больше количества цифр в дробной части х, недостающие позиции заполняются нулями.
Пример
testdb=# SELECT trunc(1.598) AS natural-truncation.
testdb-# trunc(1.598. 1) AS one_decima1_point,
testdb-# trunc(1.598, 8) AS extra_places:
natural_truncation one_decimal_point | extra_places
1 | 1.5 | 1.59800000
(1 row)
Строковые функции
В PostgreSQL существует множество разнообразных строковых функций, предназначенных для форматирования, анализа и сравнения строк. К их числу относятся как функции стандарта SQL92, так и нестандартные расширения PostgreSQL (например, ItrimO, rtrimO и substrO). Строковые функции PostgreSQL перечислены в табл. 5.10. В общем случае все, что говорится о типе text, в равной степени относится к значениям типа character и varchar.
Таблица 5.10. Строковые функции
Функция |
Описание |
ascii(s) |
Возвращает ASCII-код символа, переданного в виде строковой переменной s |
btrim(s [, t]) |
Возвращает строку s, в начале и в конце которой удалены все символы, входящие в строку t (если аргумент t не задан, усекаются начальные и конечные пропуски — пробелы, символы табуляции и т. д.) |
char length(s) |
Возвращает длину строки s в символах |
chr(n) |
Возвращает символ с ASCII-кодом n |
s ilike(f) |
Возвращает true, если выражение f совпадает (без учета регистра символов) с s |
imtcap(s) |
Возвращает строку s, в которой первая буква каждого слова преобразуется к верхнему регистру |
length(s) |
Возвращает длину строки s в символах |
s like(f) |
Возвращает true, если выражение f совпадает с s |
lower (s) |
Возвращает строку s, преобразованную к нижнему регистру |
lpad(s. n [. c]) |
Возвращает строку s, дополненную слева содержимым строки с (или пробелами, если аргумент с не задан) до длины n (или усеченную справа до n символов) |
ltrim(s [. f]) |
Возвращает строку s, в начале которой удалены все символы, входящие в строку f (если аргумент f не задан, усекаются начальные пропуски — пробелы, символы табуляции и т. д.) |
octet_length(s) |
Возвращает длину строки s в байтах |
pos1tion(b IN s) |
Возвращает позицию подстроки b в строке s (отсчет начинается с 1) |
repeat (s, n) |
Возвращает строку s, повторенную n раз |
rpad(s. n. [. c]) |
Возвращает строку s, дополненную справа содержимым строки с (или пробелами, если аргумент с не задан) до длины n (или усеченную слева до n символов) |
rtrim(s [. f]) |
Возвращает строку s, в конце которой удалены все символы, входящие в строку f (если аргумент f не задан, усекаются конечные пропуски — пробелы, символы табуляции и т. д.) |
strpos(s. b) |
Возвращает позицию подстроки b в строке s (отсчет начинается с 1). Относится к числу функций PostgreSQL и дублирует функцию SQL positionO, но с передачей аргументов в стиле С |
substr(s. b [. 1]) |
Выделяет из строки s подстроку, начинающуюся с позиции n (отсчет начинается с 1). Необязательный аргумент 1 определяет максимальную длину подстроки в символах |
substring |
Выделяет из строки s подстроку, начинающуюся с позиции n (отсчет начинается с 1). Необязательный аргумент 1 определяет максимальную длину подстроки в символах |
to_ascii (s. f) |
Возвращает строку s, преобразованную из расширенной кодировки f в ASCII |
translate(s. f. r) |
Возвращает строку s, в которой все символы, входящие в строку f, заменяются соответствующими символами строки г |
trim(направление f FROM s) |
Возвращает строку s, в начале и/или в конце которой удалены все символы, входящие в строку f. В аргументе направление передается ключевое слово SQL, определяющее направление усечения (LEADING, TRAILING или BOTH) |
upper(s) |
Возвращает строку s, преобразованную к верхнему регистру |
Ниже приведены более подробные описания всех функций, перечисленных в таблице, с указанием аргументов, типов данных и выполняемых действий.
ascii()
Синтаксис: ascii(s)
Функция asci i () получает один аргумент — отдельный символ или строку типа text, и возвращает числовой ASCII-код первого интерпретированного символа. Результат возвращается в виде значения типа integer.
Пример
booktown=# SELECT asciitТ); ascii
84
(1 row)
booktown=# SELECT DISTINCT ON (substr)
booktown-# title. substrCtitle, 1, 1),
booktown-# ascii(tltle)
booktown-# FROM books
booktOMl-f ORDER BY substr ASC:
title | substr ascii
2001: A Space Odyssey | 2 | 50
Bartholomew and the Oobleck j В I 66
Dune |D 68
Franklin in the Dark | 70
Goodnignt Moon | G j 71
Little Women L 76
Practical PostgreSQL | P j 80
The Shining Т 84
(8 rows)
btrim()
Синтаксис:
btrim(s) btrim(s. t)
Функция получает один или два аргумента типа text, второй аргумент t не является обязательным. Если аргумент t задан, функция удаляет в начале и в конце строки s все символы, входящие в строку t. Если функция вызвана с одним аргументом, удаляются начальные и конечные пропуски — пробелы, символы табуляции и т. д.
Порядок перечисления символов в строке t для функции btrim() значения не имеет. В начале и конце строки s удаляются подстроки, полностью состоящие из символов, входящих в строку t.
Пример
booktown=# SELECT btrimC whitespace example ') AS trim_blanks,
booktown-# btr1m('123example 332', '123') AS trimjnumbers:
trim_blanks | trim_numbers
whitespace example example
(1 row)
char_length()
Синтаксис:
charjength(s)
Функция SQL92 char_l engthC) получает один аргумент s типа text, varchar или character и возвращает длину полученной строки в символах. Возвращаемое значение относится к типу integer.
Пример
booktown=# SELECT charjength(title). title
booktown-l FROM books Dooktown-# LIMIT 3: charjength | title
11 | The Shining
4 Dune
21 I 2001: A Space Odyssey
(3 rows)
chr()
Синтаксис: chr(n)
Функция chr() получает один числовой аргумент п типа integer и возвращает символ с ASCII-кодом, равным п. Возвращаемое значение относится к типу text. Функция chr() фактически является обратной по отношению к функции asci 1 ().
Примеры
booktowrHf SELECT chr(65), ascii('A');
chr ! ascii
A | 65
(1 row)
initcap()
Синтаксис: initcap(s)
Функция initcapO получает один аргумент s типа text, преобразует первые буквы всех слов к верхнему регистру и возвращает полученную строку. В данном контексте «словом» считается любая последовательность символов, отделенная от других слов пробелами.
Пример
booktown=# SELECT initcapCa prospective book title'):
initcap
A Prospective Book Title
(1 row)
length()
Синтаксис:
length(s)
Аналог функции SQL92 charj ength(). Получает один аргумент s типа text, varchar или character и возвращает длину полученной строки в символах в виде значения типа integer.
Пример
booktown=# SELECT length(title), title
booktown-# FROM books
booktown-# LIMIT 3; length title
11 | The Shining 4 I Dune
21 | 2001: A Space Odyssey
(3 rows)
ПРИМЕЧАНИЕ
В стандарт SQL92 включены две функции определения длины строки: char_length() и octet_length(). Следовательно, эти две функции с большей, чем функция length(), вероятностью будут поддерживаться другими реляционными СУБД.
like() и ilike()
Синтаксис:
s like (f) s LIKE f like(s.f) s ilike(f) s HIKE f
Функция 1 i ke() проверяет, совпадает ли выражение, заданное аргументом f, со строкой s. При вызове функции либо передаются два аргумента типа text, либо используется специальный синтаксис SQL, в котором аргумент s предшествует имени функции. Функция 11 i ke() является нестандартной версией функции 11 ke(), игнорирующей регистр символов при сравнении, и вызывается только в синтаксисе SQL.
ПРИМЕЧАНИЕ
Ключевое слово SQL LIKE в PostgreSQL заменяется вызовом функции likeO. Возможность использования ключевого слова LIKE без круглых скобок — всего лишь синтаксическое удобство, на практике оба варианта эквивалентны.
Использование функции 1 ike() отличается от обычного сравнения с помощью оператора =, поскольку строка f может содержать символы подчеркивания (_) или процента (%), интерпретируемые особым образом. PostgreSQL интерпретирует символ _ как один произвольный символ, а символ % — как ноль или более произвольных символов. Эти специальные символы могут находиться в любом месте строки f.
В PostgreSQL существуют и более совершенные средства поиска по шаблону, о которых говорилось в пункте «Операторы регулярных выражений» подраздела «Строковые операторы» раздела «Операторы» этой главы.
Примеры
booktown=# SELECT * FROM books
booktown-# WHERE title LIKE ('XRabbit1):
id i title | authorjd subjectjd
1234 | The Velveteen Rabbit | 25041 | 3
(1 row)
booktown=# SELECT * FROM books
booktown-# WHERE title LIKE
id | title | authorjd | subjectjd
4513 | Dune | 1866 | 15
25908 | Franklin in the Dark | 15990 | 2 (2 rows)
booktown=# SELECT * FROM books
booktown-# WHERE title ILIKE '«python*':
id | title | authorjd | subjectjd
41473 | Programming Python | 7805 | 4 41477
Learning Python | 7805 4
(2 rows)
lower()
Синтаксис: lower(s)
Функция SQL92 1 ower () получает один аргумент типа text, преобразует все символы строки к нижнему регистру и возвращает полученную строку в виде значения типа text.
Пример
booktown=# SELECT lower(title)
booktown-# FROM books
booktown-# LIMIT 3;
lower
tne shining
dune
2001: a space odyssey
lpad()
Синтаксис:
lpad(s. n) 1pacl(s. n. c)
Функция lpad() вызывается с двумя или тремя аргументами s, n и с (необязательный аргумент), относящимися к типам text, Integer и text соответственно. Строка s дополняется слева до длины n символов пробелами или содержимым необязательного аргумента с.
Если начальная длина строки s больше п, строка усекается справа до длины п.
Пример
booktown=# SELECT title. IpadCtitle, 12, AS dashed,
booktown-# IpadCtitle. 12. '-+-') AS pius_dashed
booktown-# FROM books LIMIT 4;
title | dashed | plus_dashed _
The Shining | -The Shining | -The Shining
Dune |Dune Dune
2001: A Space Odyssey | 2001: A Spac | 2001: A Spac
The Cat in the Hat | The Cat in t | The Cat in t
(4 rows)
Itrim()
Синтаксис:
Itrim(s) ItrimCs. f)
Функция 11 ri m() получает один или два аргумента типа text (аргумент f не обязателен). Если аргумент f не задан, функция возвращает строку s, из которой удалены все начальные пробелы. В противном случае удаляется начальная подстрока, состоящая только из символов, содержащихся в f. Если такая подстрока не найдена, s остается без изменений.
Примеры
booktown=# SELECT ItrimC whitespace example'):
Itrim
whitespace example (1 row)
booktown=# SELECT title. ItrimCtitle, 'TD2he ')
booktown-# FROM books booktown-# LIMIT 4:
title | Itritn
The Shining | Shining
Dune I une
2001: A Space Odyssey | 001: A Space Odyssey
The Cat in the Hat j Cat In the Hat
(4 rows)
octet_length()
Синтаксис: octetjength(s)
Функция SQL92 octetj ength() получает один аргумент s типа text, varchar или character и возвращает длину полученной строки в байтах. Возвращаемое значение относится к типу integer.
В большинстве случаев длина строки в байтах совпадает с количеством символов, хотя в расширенных кодировках не всегда, поскольку в них символ по определению может состоять из нескольких байтов.
Пример
booktown=# SELECT title, octetjength(title)
booktown-# FROM books
booktown-# ORDER BY title ASC
booktown-# LIMIT 3:
title octet Jength
2001: A Space Odyssey | 21
Bartholomew and the Oobleck | 27
Dune | 4
(3 rows)
position()
Синтаксис: position(b IN s)
Функция SQL92 position^) получает два аргумента, относящихся к типу text, и возвращает начальную позицию подстроки b в строке s (отсчет начинается с 1). Возвращаемое значение относится к типу i nteger. Если подстрока не найдена, функция возвращает 0.
Пример
booktown=# SELECT title, positiorK'the' IN title) AS the_pos
booktown-# FROM books
booktown-# WHERE positionCthe1 IN title) != 0:
title | the_pos
The Cat in the Hat | 12
Bartholomew and the Oobleck | 17
Franklin in the Dark 13
(3 rows)
repeat()
Синтаксис: repeat(s. n)
Функция repeat О получает два аргумента s и п, относящихся к типам text и integer соответственно. Функция возвращает символьную строку s, повторенную п раз, в виде значения типа text.
Пример
booktown=# SELECT repeat(lastjname. 2)
booktown-l FROM authors booktown-# LIMIT 3; repeat
DenhamDenham BourgeoisBourgeois BiancoBianco
(3 rows)
rpad()
Синтаксис:
rpad(s. n) rpad(s. n. c)
Функция rpadO похожа на функцию IpadO, но дополняет строку справа, а не слева. Она вызывается с двумя или тремя аргументами s, n и с (необязательный аргумент), относящимися к типам text, integer и text соответственно. Строка s дополняется справа до длины п символов пробелами или содержимым необязательного аргумента с.
Если начальная длина строки s больше п, строка усекается слева до длины п.
Пример
booktown=# SELECT rpad('whitespace example'. 30): rpad
whitespace example (1 row)
booktown=# SELECT title. rpacKtitle. 12, ' -') AS right_dashed.
booktown-# rpad(title, 12, '-+-') AS right_plus_dashed
booktown-# FROM books
booktown-f LIMIT 3:
title [ right_dashed | right_plus_dashed
The Shining The Shining- | The Shining-Dune Dune
2001: A Space Odyssey 2001: A Spac 2001: A Spac
(3 rows)
rtrim()
Синтаксис:
rtrim(s)
trlm(s. f)
Функция rtri m() получает один или два аргумента типа text (аргумент f не обязателен). Если аргумент f не задан, функция возвращает строку s, из которой удалены все завершаю nine пробелы. В противном случае удаляется завершающая подстрока, состоящая только из символов, содержащихся в f. Если такая подстрока не найдена, s остается без изменений.
Примеры
booktown=# SELECT rtrimC'whitespace example ');
rtrim
whitespace example
(1 row)
booktown=# SELECT title, rtrinKtitle, 'yes')
booktown-# FROM books
booktown-# LIMIT 4;
title rtrim
The Shining | The Shining
Dune Dun 2001: A Space Odyssey 2001: A Space Od
The Cat in the Hat j The Cat in the Hat
(4 rows)
strpos()
Синтаксис: strpos(s. b)
Функция strposO эквивалентна функции SQL92 positionO, но аргументы передаются ей в стиле С. Функция получает два аргумента, относящихся к типу text, и возвращает начальную позицию подстроки b в строке s (отсчет начинается с 1). Возвращаемое значение относится к типу 1 nteger. Если подстрока не найдена, функция возвращает 0.
Пример
booktown=# SELECT title, strposdower(title), 'rabbit')
booktown-l FROM books
booktown-# WHERE strposdower(title), 'rabbit') != 0;
title | strpos
The Velveteen Rabbit | 15
(1 row)
substr()
Синтаксис:
substr(s. n) substr(s. n. 1)
Функция substrO эквивалентна функции SQL92 substring!), но аргументы передаются ей в стиле С. Функция вызывается с двумя или тремя аргументами s, n и 1 (необязательный аргумент), относящимися к типам text, т nteger и i nteger соответственно. Возвращаемое значение представляет собой подстроку s, начинающуюся с позиции п. Необязательный аргумент 1 определяет максимальную длину подстроки в символах.
Если заданная длина подстроки превышает количество оставшихся символов в строке s, возвращается только остаток строки. Иначе говоря, возвращаемое значение не дополняется до заданной длины.
Пример
booktown=# SELECT title, substr(title, 15). substr(title. 5. 9)
booktown-# FROM books
booktown-# ORDER BY title DESC
booktown-# LIMIT 3;
title | substr | substr
The Velveteen Rabbit Rabbit | Velveteen
The Tell-Tale Heart Heart Tell-Tale
The Shining | | Shining
(3 rows)
substring()
Синтаксис:
substrts. n) substr(s, n. 1)
Функция SQL92 substring() эквивалентна функции PostgreSQLsubstr(). Функция вызывается с двумя или тремя аргументами s, n и 1 (необязательный аргумент), относящимися к типам text, integer и integer соответственно. Возвращаемое значение представляет собой подстроку s, начинающуюся с позиции п. Необязательный аргумент 1 определяет максимальную длину подстроки в символах.
Примеры
booktown=# SELECT title, substring(title FROM 15)
booktown-# FROM books
booktown-* ORDER BY title DESC
booktown-# LIMIT 3;
title | substring
The Velveteen Rabbit | Rabbit
The Tell-Tale Heart Heart The Shining
(3 rows)
booktown=# SELECT title, substring(title FROM 5 FOR 9)
booktown-# FROM books
booktown-# ORDER BY title DESC booktown-# LIMIT 3;
title | substring
The Velveteen Rabbit Velveteen
The Tell-Tale Heart Tell-Tale
The Shining | Shining
(3 rows)
to_ascii()
Синтаксис:
to_ascii(s, f)
Функция to_asci i () получает строковый аргумент s, относящийся к типу text, и обозначение расширенной кодировки f, а возвращает обычный ASCII-текст в виде значения типа text.
Допустимы следующие обозначения расширенных кодировок: LATIN1 (ISO 8859-1), LATIN2 (ISO 8859-2) и WIN1250 (Windows CP1250 или WinLatin2). Для работы функции необходима поддержка расширенных кодировок (устанавливается при помощи ключа командной строки компилятора при установке PostgreSQL).
Пример
booktown=# SELECT to_ascii('Multibyte Source', 'LATIN1');
to_ascii
Multibyte Source
(1 row)
translate()
Синтаксис: translate(s. f. r)
Функция transl ate() получает три аргумента s, f и г, относящихся к типу text. В строке s все символы, входящие в строку f, заменяются символами с тем же индексом из строки г. Возвращаемое значение относится к типу text.
Обратите внимание: функция заменяет не экземпляры всей строки f, а любые символы, входящие в эту строку. Если f содержит больше символов, чем г, то все символы f, не имеющие аналогов в г, просто удаляются из s (удобный способ удаления ненужных символов).
В следующем примере все вопросительные знаки заменяются восклицательными.
Пример
booktown=# SELECT translated am an example?', '?', '!'):
translate
I am an example!
(1 row)
В следующем примере все вхождения символа «i» заменяются символом «w», а все вхождения символа «s» — символом «а». Лишний символ в конце строки «was» игнорируется.
Пример
booktown=# SELECT translate('This is a mistake.', 'is', 'was');
translate
Thwa wa a mwatake.
(1 row)
В последнем примере все гласные буквы заменяются пустой строкой, то есть удаляются из входной строки.
Пример
booktown=# SELECT title.
booktown-# translateCtitle, 'aeiouAEIOU', '') AS vowelless
booktown-# FROM books
booktown-f LIMIT 5;
title | vowelless
The Shining Th Shnng
Dune I Dn
2001: A Space Odyssey | 2001: Spc dyssy
The Cat In the Hat | Th Ct n th Ht
Bartholomew and the Oobleck Brthlmw nd th blck
(5 rows)
trim()
Синтаксис:
trim(направление f FROM s)
Функция SQL92 trim() способна заменить функции PostgreSQL rtrim(), ltrim() и btrim(). При вызове она получает три аргумента: ключевое слово (LEADING, TRAILING или BOTH) и две строки, f и s.
С ключевым словом LEADING функция trim() работает аналогично функции ItrimO, удаляя в начале строки s наибольшую подстроку, все символы которой входят в f.
С ключевым словом TRAILING функция trim() работает аналогично функции rtrim(), удаляя в конце строки s наибольшую подстроку, все символы которой входят в f.
С ключевым словом BOTH функция trim() работает аналогично функции btrim(), удаляя в начале и в конце строки s наибольшие подстроки, все символы которых входят в f.
Примеры
booktowrH1 SELECT isbn, trim(LEADING '0' FROM isbn)
booktown-# FROM editions booktown-# LIMIT 2; isbn | Itrim
039480001X 39480001X 0451160916 451160916
(2 rows)
booktown=# SELECT isbn, trimCTRAILING 'X' FROM isbn)
booktown-# FROM editions booktown-# LIMIT 2;
1Sbn rtrim
039480001X j 039480001 0451160916 j 0451160916
(2 rows)
booktowrHf SELECT isbn, trimCBOTH 'OX' FROM isbn)
booktown-# FROM editions booktown-# LIMIT 2; isbn I btrim
039480001X | 39480001 0451160916 | 451160916
(2 rows)
upper()
Синтаксис:
upper(s)
Функция SQL92 upper() получает один аргумент типа text, преобразует все символы строки к верхнему регистру и возвращает полученную строку в виде значения типа text.
Пример
booktown=# SELECT title, upper(title)
booktown-# FROM books
booktown-# ORDER BY id ASC
booktown-# LIMIT 3;
title | upper
The Tell-Tale Heart | THE TELL-TALE HEART
Little Women j LITTLE WOMEN
The Velveteen Rabbit | THE VELVETEEN RABBIT
(3 rows)
Функции для работы с датой и временем
В PostgreSQL поддерживаются как стандартные функции SQL current_date, current_time и current_timestamp, так и множество нестандартных функций. Функции PostgreSQL, предназначенные для работы с датой и временем, перечислены в табл. 5.11.
Таблица 5.11. Функции для работы с датой и временем
Функция | Описание |
current date |
Возвращает текущую дату в виде значения типа date |
current time |
Возвращает текущее время в виде значения типа time |
current timestamp |
Возвращает текущие дату и время в виде значения типа timestamp |
date_part(s. t) |
Выделяет из значения типа timestamp компонент даты или времени, определяемый строкой s |
date_part(s. i) |
Выделяет из значения типа interval компонент даты или времени, определяемый строкой s |
date trunc(s, t) |
Возвращает значение типа timestamp, усеченное до точности s |
extract (k FROM t) |
Выделяет из значения типа timestamp компонент даты или времени, определяемый ключевым словом k |
extracttk FROM i) |
Выделяет из значения типа interval компонент даты или времени, определяемый ключевым словом k |
isfinite(t) |
Возвращает true, если значение типа timestamp соответствует конечной величине (не invalid и не infinity) |
isfinite(i) |
Возвращает true, если значение типа interval соответствует конечной величине (не infinity) |
now() |
Возвращает текущие дату и время в виде значения типа timestamp. Эквивалент константы now |
timeofdayO |
Возвращает текущие дату и время в виде значения типа text |
Ниже приведены более подробные описания всех функций, перечисленных в таблице. Обратите внимание на отсутствие круглых скобок в определениях функций current_date, current_time и current_timestamp — это сделано для сохранения совместимости со стандартом SQL92.
current_date
Синтаксис:
current_date
Функция current_date вызывается без аргументов и возвращает текущую дату в виде значения типа date. Результат эквивалентен преобразованию специальной константы now к типу date.
Пример
booktown=# SELECT current_date,
booktown-# 'now'::date AS date;
date date
2001-08-31 | 2001-08-31
(1 row)
current_time
Синтаксис:
current_time
Функция current_time вызывается без аргументов и возвращает текущее время в виде значения типа time. Результат эквивалентен преобразованию специальной константы now к типу time.
Пример
booktown=# SELECT current_time,
booktown-# 'now'::time AS time;
time | time
11:36:52 | 11:36:52
(1 row)
current_timestamp
Синтаксис:
current_timestamp
Функция current_timestamp вызывается без аргументов и возвращает текущее время в виде значения типа timestamp. Результат эквивалентен преобразованию специальной константы now к типу timestamp или вызову функции now().
Пример
booktown=# SELECT current_timestamp.
booktown-# now() AS timestamp;
timestamp | timestamp
2001-08-31 11:39:42-07 2001-08-31 11:39:42-07
(1 row)
date_part()
Синтаксис:
date_part(s. t) date_part(s. i)
Функция date_part() получает два аргумента. Первый аргумент s относится к типу text, а второй, t или I, — к типу timestamp или interval соответственно. Функция выделяет во втором аргументе компонент, определяемый строкой s, и возвращает его в виде значения типа doubl e preci si on.
Чтобы лучше понять, как работает функция date_part(), представьте, что значение типа timestamp или interval делится на компоненты — часы, минуты и т. д. Эти компоненты (и соответственно допустимые значения аргумента s) перечислены в табл. 5.12. Помните, что некоторые значения относятся только к типу tlmestamp и не поддерживаются для типа Interval.
Таблица 5.12. Компоненты типов timestamp и interval
Компонент | Описание |
century |
Год, разделенный на 100 (не совпадает с текущим веком!) |
day |
День месяца (от 1 до 31) для типа timestamp, продолжительность интервала в днях для типа interval |
decade |
Год, разделенный на 10 |
dow |
День недели (от 0 до 6), начиная с воскресенья. Для типа interval не поддерживается |
doy |
День года (от 1 до 366). Для типа interval не поддерживается |
epoch |
Количество секунд от начала эпохи (1 января 1970 г.) для типа timestamp, продолжительность интервала в секундах для типа interval |
hour |
Час в значении типа timestamp |
microseconds |
Количество миллионных долей в дробной части секунд для значения типа timestamp |
millennium |
Год, разделенный на 1000 (не совпадает с текущим тысячелетием!) |
mi 11 i seconds |
Количество тысячных долей в дробной части секунд для значения типа timestamp |
minute |
Минуты в значении типа timestamp или interval |
month |
Месяц в значении типа timestamp или остаток от деления продолжительности интервала в месяцах на 12 для типа interval |
quarter |
Квартал (от 1 до 4) для значений типа timestamp |
second |
Секунды в значении типа timestamp или interval |
week |
Номер недели в году для значений типа timestamp. В стандарте ISO-8601 первая неделя года определяется как неделя, в которую входит 4 января |
year |
Год в значении типа timestamp или interval |
Примеры
booktown=# SELECT date_part('minute'.
booktown(# intervalC3 days 4 hours 12 minutes')):
date_part
12
(1 row)
booktown=# SELECT isbn,
booktown-l date_part('year', publication)
booktown-# FROM editions
booktown-# ORDER BY date_part ASC
booktown-# LIMIT 3;
isbn | date_part
0760720002 | 1868
0679803335 | 1922
0694003611 | 1947
(3 rows)
ПРИМЕЧАНИЕ
Аналогом функции date_part() в SQL является функция extract().
date_trunc()
Синтаксис: date_trunc(s. t)
Функция date_trunc () получает два аргумента s и t, относящихся к типам text и timestamp соответственно. Строка s определяет компонент, до которого усекается аргумент t. В данном контексте под усечением понимается удаление всех компонентов, детализация которых превышает заданную.
Допустимые значения аргумента s перечислены в табл. 5.12.
Пример
booktown=# SELECT date_trune('minute', now());
date trunc
2001-08-31 09:59:00-07
(1 row)
booktown=# SELECT date_trunc( 'hour', now());
date trunc
2001-08-31 09:00:00-07 (1 row)
booktown=# SELECT date_trunc('year', now());
date trunc
2001-01-01 00:00:00-08
(1 row)
extract()
Синтаксис:
extract(k FROM t) extract(k FROM 1)
Функция SQL92 extractO представляет собой аналог функции PostgreSQL date_part() со слегка измененным синтаксисом. При перечислении аргументов вместо запятой используется ключевое слово FROM. Аргументы аналогичны аргументам функции date_part(), хотя первый аргумент является ключевым словом SQL, а не строкой и поэтому не заключается в кавычки. Допустимые значения k перечислены в табл. 5.12.
Учтите, что функция extractO является «псевдонимом» функции PostgreSQL date_part () в синтаксисе SQL92, поэтому по умолчанию в выходных данных функция extract() представляется именем date_part.
Примеры
booktown=# SELECT extract(MINUTE FROM
interval('3 days 12 minutes1)): datejpart
12
(1 row)
booktown=# SELECT extractCMONTH FROM now()):
date_part
8
(1 row)
isfinite()
Синтаксис:
isfinite(t) isfinite(i)
Функция 1 sf 1 ni te() получает один аргумент типа timestamp или 1 interval. Она возвращает true, если переданное значение не является бесконечным, созданным при помощи специальной константы Infinity или invalid (используется только для timestamp).
Пример
booktown=# SELECT isfinite('now'::timestamp) AS now_is_finite,
booktown-# isfinite('infinity'::timestamp) AS Infinity,
booktown-# isfiniteC'invalid'::timestamp) AS invalid;
now_is_finite | infinity | invalid
(1 row)
now()
Синтаксис:
now()
Функция now() вызывается без аргументов и возвращает текущую дату и время в виде значения типа timestamp.
Пример
booktown=# SELECT now();
now
2001-08-31 10:31:18-07
(1 row)
timeofday()
Синтаксис: timeofdayO
Функция timeofday() вызывается без аргументов и возвращает текущие время и дату. Она похожа на функцию now(), но возвращает значение типа text. Это делает ее менее удобной, поскольку значение не разделяется на компоненты функциями date_part() и to_char() без предварительного преобразования к другому типу.
Пример
Dooktown=# SELECT timeofday();
timeofday
Fn Aug 31 10:33:00.837338 2001 PDT
(1 row)
Функции преобразования типа
Хотя PostgreSQL позволяет выполнять явные преобразования между основными типами данных, некоторые преобразования удобнее выполнять при помощи функций. В табл. 5.13 перечислены основные функции преобразования типов PostgreSQL, а ниже приводятся их подробные описания.
Таблица 5.13. Функции преобразования типов
Функция | Описание |
t>1tfromint4(n) |
Преобразует число в битовую последовательность |
DlttOinW(b) |
Преобразует битовую последовательность в десятичное представление |
to_cnar(n. f) |
Преобразует число в строку в формате f |
to_char(t. f) |
Преобразует значение типа timestamp в строку в формате f |
to_date(s. f) |
Преобразует строку в формате даты f в значение типа date |
to_number(s. f) |
Преобразует строку в формате даты f в значение типа numeric |
to timestamp(s. f) |
Преобразует строку в формате даты f в значение типа timestamp |
timestamp(d) |
Преобразует значение типа date к типу timestamp |
timestamp(d. t) |
Преобразует два значения типов date и time к типу timestamp |
bitfromint4()
Синтаксис:
bit.fromint4(n)
Функция bitfromint4() получает один аргумент п типа integer и возвращает его представление в виде битовой последовательности. Поскольку явного преобразования между двоичным и целочисленным типом не существует, преобразование десятичных данных в двоичную систему счисления должно Осуществляться специальной функцией.
Возвращаемое значение относится к типу bi t, а его длина не превышает 32 бита. Поскольку тип i nteger является знаковым, допустимые значения аргумента лежат в интервале от -2 147 483 648 до 2 147 483 647.
Пример
booKtown=# SELECT bitfronrint4(16385);
bitfromint4
00000000000000000100000000000001
(1 row)
bittoint4()
Синтаксис:
bittoint4(b)
Функция bittoint4() фактически является обратной по отношению к bitfromint4() — она получает один аргумент b тина bit п возвращает его десятичное числовое значение в виде тина integer.
Соответственно аргумент функции bitfrwint4() содержит до 32 двоичных цифр, а возвращаемое значение лежит в интервале от -2 147 483 648 до 2 147 483 647.
Пример
booktown=# SELECT bittoint4(B'101010').
booktown-# Mttoint4(bitfromint4(99))
AS inverse_example: bittoint4 inverse_example
42 | 99
(1 row)
to_char() для чисел
Синтаксис:
to_char(n. f)
Функция to_char(), вызываемая с аргументом п типа numeri с и аргументом f типа text, форматирует число п в строку типа text. Строка f описывает формат выходного значения.
Форматная строка f состоит из метасимволов, вместо которых PostgreSQL подставляет представляемые ими значения. Метасимволы, используемые в форматных строках, перечислены в табл. 5.14.
Таблица 5.14. Метасимволы форматирования чисел
Символ | Описание |
9 |
Цифра |
0 |
Цифра или начальный/конечный ноль, если количество цифр в f превышает количество цифр в п; может использоваться для принудительного вывода цифр в левой или правой части результата |
. | Точка, отделяющая целую часть числа от дробной. Число может содержать только одну точку |
' |
Запятая. Число может содержать несколько запятых, используемых для разделения групп разрядов (тысячи, миллионы и т. д.) |
D |
Десятичный разделитель (например, точка), определяемый в локальном контексте |
G |
Разделитель групп разрядов (например, запятая), определяемый в локальном контексте |
PR |
Если PR находится в конце строки f, для отрицательных значений п результат заключается в угловые скобки |
SG |
Знак плюс (+) или минус (-) в зависимости от значения п |
MI |
Знак минус (-), если число п является отрицательным |
PL |
Знак плюс (+), если число п является положительным |
S |
Знак плюс (+) или минус (-), определяемый в локальном контексте |
L |
Денежный знак, определяемый в локальном контексте |
RN |
Римские цифры для значений п в интервале от 1 до 3999 |
TH. th |
Суффикс числительного для числа п (например, 4th или 2nd) |
V |
Для каждого метасимвола 9 после V добавляется лишний ноль, то есть фактически происходит умножение на степень 10 |
FM |
Из числа удаляются все начальные и завершающие нули (созданные символами 9, но не 0), а также все лишние пробелы |
Если количество цифровых позиций, обозначенных метасимволом 9 в форматной строке, превышает количество цифр в числе п, лишние позиции заполняются пробелами. Если лишние цифровые позиции обозначены метасимволом 0, лишние позиции заполняются нулями.
Если количество заданных цифровых позиций меньше необходимого для представления целой части числа, преобразование становится неоднозначным из-за потери значащих цифр. Поскольку функция to_char() не знает, какие именно цифры следует удалить, во всех заданных позициях выводится символ #. Следовательно, в форматную строку необходимо включить максимальное количество цифр, кото-
рые могут быть получены в результате форматирования. Для удаления лишних пробелов также можно воспользоваться функцией trans! ate() или функциями усечения (HrimO и т. д.).
Чтобы метасимвол интерпретировался в форматной строке буквально (то есть как литерал), заключите его в кавычки. Чтобы включить в форматную строку литеральный символ кавычки, его необходимо экранировать двумя обратными косыми чертами.
ПРИМЕЧАНИЕ
В форматной строке можно свободно использовать любые символы, не являющиеся метасимволами (например, символ $ и др.) В отформатированной строке они выводятся без изменений.
Примеры
booktown=# SELECT to_char(123456789. '999G999G999D99') AS formatted,
booktown-# to_char(123456789. '999999999') AS justjrigits,
booktown-f to_char(123456789, '00999999999') AS with_zeroes;
formatted | justjrigits | with_zeroes
123.456.789.00 | 123456789 | 00123456789
(1 row)
booktown=# SELECT cost * 100 AS cost_to_order.
booktown-# to_char(cost * 100, '$99.999.99') AS monetary,
booktown-# translate(to_char(cost * 100. '$9,999.99'),' ',").
booktown-# AS translated
booktown-# FROM stock
booktown-* LIMIT 3;
cost_to_order monetary translated
2900.00 | $ 2.900.00 $2.900.00
3000.00 $ 3.000.00 $3.000.00
1600.00 $ 1,600.00 i $1.600.00
(3 rows)
booktown=# SELECT tojrhard.O. '9th "Place"') AS first.
booktown-# to_char(2.2, '9th "Place"') AS second,
booktown-# to_char(pi( ), '9th "Place"') AS third,
booktown-# to_char(10, '99V99th "\\"Place\\.....) AS shifted jjp;
first | second | third | shifted_up
1st Place | 2nd Place | 3rd Place | 1000th "Place"
(1 row)
ПРИМЕЧАНИЕ
В PostgreSQL версии 7.1.x ошибка в реализации метасимволов RN (римская запись) приводит к тому, что функция to_char() возвращает неправильный результат, если в форматной строке отсутствует последовательность FM. Ошибка должна быть исправлена в версии 7.2, а в качестве временной меры можно использовать полную последовательность FMRN.
to_char() для типа timestamp
Синтаксис:
to_char(t. f)
При вызове с аргументом t типа timestamp и аргументом f типа text функция to_char() форматирует дату и время в строку, возвращаемую в виде значения типа text.
Как и в случае с предыдущей версией to_char(), строка f содержит метасимволы, вместо которых PostgreSQL подставляет литералы. Метасимволы, используемые в форматных строках даты и времени, перечислены в табл. 5.15.
Таблица 5.15. Метасимволы форматирования чисел
Символ | Описание |
НН. НН12 |
Час (от 1 до 12) |
НН24 |
Час (от 0 до 23) |
Ml |
Минуты (от 0 до 59) |
SS |
Секунды (от 0 до 59) |
SSSS |
Секунды, прошедшие с полуночи (от 0 до 86 399) |
AM, РМ, А.М, Р.М |
Обозначение части суток в верхнем регистре с необязательным разделением символов точками |
am, pm, a . m, p . m |
Обозначение части суток в нижнем регистре с необязательным разделением символов точками |
TZ, tz |
Часовой пояс в верхнем или нижнем регистре |
CC |
Век, представленный двумя цифрами (не равен тку, деленному на 100!) |
Y, YY, YYY, YYYY, Y.YYY |
Последняя цифра, две цифры, три или четыре цифры года (с необязательным включением запятой) |
BC, AD, B.C, A.O |
Признак эры в верхнем регистре |
be, ad, b.c, a.d |
Признак эры в нижнем регистре |
MONTH, Month, month |
Полное название месяца, дополненное справа пробелами до 9 символов и записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре |
MON, Mon, mon |
Сокращенное трехбуквенное обозначение месяца, записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре |
MM |
Номер месяца (от 1 до 12) |
RN, rn |
Номер месяца в римской записи (от I до XII), в верхнем или нижнем регистре |
DAY, Day, day |
Полное название дня недели, дополненное справа пробелами до 9 символов и записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре |
DY, Dy, dy |
Сокращенное двухбуквенное обозначение дня недели, записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре |
DDD, DD, D |
День года (от 1 до 366), день месяца (от 1 до 31) или день недели (от 1 до 7, начиная с воскресенья) |
W |
Неделя месяца (от 1 до 5, с первого дня месяца) |
WW |
Неделя года (от 1 до 53, с первого дня года) |
IW |
Неделя года в стандарте ISO (с первого четверга нового года) |
TH, th |
Суффикс для предшествующего числа в верхнем или нижнем регистре |
fm |
Из строки удаляются все лишние нули и пробелы |
Суффикс ТН и префикс FM должны непосредственно примыкать к тому значению, которое они модифицируют. Например, чтобы префикс FM применялся к компоненту Day, строка должна иметь вид FMDay (а не FM Day). Аналогично, чтобы день месяца выводился с суффиксом числительного, потребуется форматная строка DDTH (а не DD ТН).
Примеры
booktown=# SELECT to_char(now(). 'HH:MI PM1) AS the_time;
the_time
05:04 PM
(1 row)
booktown=# SELECT to_char(now(), 'Dy (Day), Mon (Month)')
booktown-# AS abbreviations,
booktown-# to_char('yesterday'::timestamp, 'FMMonth FMDDth')
booktown-# AS yesterday.
booktown-# to_char('yesterday':itimestamp, 'FMDDth FMMonth')
booktown-# AS "yesterday UK";
abbreviations | yesterday j yesterday UK
Sat (Saturday ). Sep (September) | August 31st | 31st August
(1 row)
booktown=# SELECT isbn,
booktown-# to_char(publication, 'FMMonth FMDDth, YYYY')
booktown-# AS informal,
booktown-# to_char(publication, 'YYYY-MM-DD') AS formal,
booktown-# to_char(publication. 'Y.YYY "years" A.D.')
booktown-# AS firstj)ublished
booktown-# FROM editions LIMIT 3;
isbn | informal | formal first_pub1ished
039480001X | March 1st. 1957 1957-03-01 1.957 years A.O.
0451160916 | August 1st. 1981 | 1981-08-01 | 1.981 years A.D.
0394800753 | March 1st. 1949 | 1949-03-01 | 1.949 years A.D.
(3 rows)
to date()
Синтаксис:
to_date(s. f)
Функция to_date() получает два аргумента типа text. Аргумент f описывает формат даты, представленной строкой s, и содержит метасимволы из табл. 5.15. Результат возвращается в виде значения типа date.
В PostgreSQL поддерживается много распространенных форматов данных, однако предусмотреть все форматы невозможно. Функция to_date() гарантирует, что практически любой формат даты, описываемый метасимволами из табл. 5.14, может быть преобразован в значение типа date.
Пример
booktown=# SELECT date('198025thJune')
booktown-f AS non_standard_date_format,
booktown -# toJate (' 198025thJune', ' YYYYDDthMonth')
booktown-# AS correct_interpretation;
non_standard_date_format correct_interpretation
2025-08-27 | 1980-06-25
(1 row)
to_number()
Синтаксис:
to_number(s. f)
Функция to_number() получает два аргумента типа text. Аргумент f описывает формат числа, представленного строкой s, и содержит метасимволы из табл. 5.14. Результат возвращается в виде значения типа numeric.
Примеры
booktown=# SELECT to_number('$2,900.00', 'L9G999D99')
booktown-# AS monetary: monetary
2900.00 (1 row)
booktown=# SELECT tojiumber('123.456.789.00' . '999G999G999D99')
booktown-# AS formatted,
booktown-# to_numberС123456789'. '999999999')
booktown-# AS just_digits,
booktown-# to_number('00123456789'. '00999999999')
booktown-# AS leading_zeroes;
formatted | just_d1gits | leading_zeroes
123456789.00 123456789 | 123456789
(1 row)
to_timestamp()
Синтаксис:
to_timestamp(s. f)
Функция to_timestamp() получает два аргумента типа text. Аргумент f описывает формат даты/времени, представленного строкой s, и содержит метасимволы из табл. 5.15. Результат возвращается в виде значения типа date.
Эта функция, как и to_date(), прежде всего обеспечивает возможность правильной интерпретации нестандартных строк, содержащих дату и время.
Пример
booktown=# SELECT timestamp('197825thJuly01:12am')
booktown-# AS non_standard_timestamp,
booktown-l to_fimestamp('197825July01:12am',
booktown(# 'YYYYDDFMMonthHH12:MIam')
booktown-# AS correcMnterpretation;
non_standard_timestamp | correctjnterpretation
2025-06-27 01:12:00-07 1978-07-25 01:12:00-07
(1 row)
ПРИМЕЧАНИЕ
Модификатор FM имеет важное значение для правильной интерпретации данных, следующих за названием месяца или дня недели, поскольку эти названия часто дополняются пробелами до 9 символов. Помните, что модификатор FM не является глобальным — он должен предшествовать каждом/элементу, к которому он применяется.
timestamp()
Синтаксис:
timestamp(d) timestamptd, t)
Функция ti mestampC) получает либо один аргумент типа date, либо два аргумента типов date и time соответственно. Переданные аргументы преобразуются в значение типа tlmestamp и возвращаются функцией. При передаче одного аргумента предполагается, что время соответствует полуночи заданной даты.
Пример
booktown=# SELECT timestamp(date('now'))
AS today_at_midnight,
booktown-# timestamp(dateCnow'),
booktownd time('now')) AS right_now;
today_at_m1dnight | rightjiow
2001-09-01 00:00:00-07 | 2001-09-01 18:04:16-07
(1 row)
Агрегатные функции
Агрегатными функциями называется особый класс функций, применяемых сразу к нескольким записям набора данных, но возвращающим одно значение. Обычно агрегатные функции используются в запросах с группировкой по критерию, заданному в секции GROUP BY, но также встречается их применение в запросах, у которых целевой список состоит только из агрегатных функций. В этом случае агрегатная функция обрабатывает все записи итогового набора.
В табл. 5.16 перечислены агрегатные функции, поддерживаемые в PostgreSQL. Полный список агрегатных функций выводится в psql командой \da.
Таблица 5.16. Агрегатные функции
Функция | Описание |
avg( выражение') |
Возвращает среднее арифметическое значений выражения для всех записей в группе |
count ( выражение) |
Возвращает количество записей в группе, для которых значение выражения отлично от NULL |
ma x ( выражение} |
Возвращает максимальное значение выражения в группе |
mint выражение) |
Возвращает минимальное значение выражения в группе |
stddev ( выражение) |
Возвращает среднеквадратичное отклонение значений выражения в группе |
surrK выражение) |
Возвращает сумму значений выражения в группе |
variance( выражение) |
Возвращает дисперсию значений выражения в группе |
Ниже приведены более подробные описания всех агрегатных функций с конкретной информацией об особенностях использования, примерами и допустимыми типами входных данных. В дальнейших описаниях термин выражение означает любой идентификатор в итоговом наборе или любое действительное выражение, выполняющее операцию с этим идентификатором.
Агрегатные выражения
При вызове агрегатной функции передается агрегатное выражение, применяемое к записям, созданным командой SELECT. По своей структуре агрегатные выражения сходны с обычными выражениями SQL, но они могут начинаться с ключевого слова ALL или DISTINCT.
Если задано ключевое слово DISTINCT, функция обрабатывает только группы с уникальными значениями агрегатного выражения; группы с повторяющимися значениями игнорируются. Ключевое слово ALL, как и в команде SELECT, всего лишь явно указывает на тот факт, что выражение относится ко всем группам. В листинге 5.19 приведены примеры разных форм агрегатных выражений.
Листинг 5.19. Использование агрегатных выражений
booktown=# SELECT count(location) AS setjocations,
booktown-# count(ALL location) AS all_set_locations,
booktown-# count(DISTINCT location) AS unique_locations,
booktown-# count(*) AS all_rows booktown-# FROM subjects;
setjocations | all_set_locations | uniquejocations all_rows
15 15 | 7 16
(1 row)
У агрегатных выражений также имеется специальная форма, продемонстрированная в столбце al l_rows выходных данных листинга 5.19. Если при вызове агрегатной функции передается звездочка (*), это означает, что функция должна обрабатывать все поля, в том числе и обычно игнорируемые поля со значениями NULL. Поскольку таблица subjects содержит одну запись с полем location, равным NULL, результат подсчета записей по полю 1 ocati on отличается от результата подсчета по тому же нолю с использованием символа *.
ВНИМАНИЕ
Записи, у которых в агрегатное выражение входит NULL, не обрабатываются агрегатными функциями (исключением является функция count().
avg()
Синтаксис: avg(выражение)
Функция avg() получает агрегатное выражение, результат которого относится к любому из числовых типов (numeric, bigint, smallint, real или double precision) или к типу interval.
Функция возвращает среднее арифметическое всех данных, описываемых выражением. Возвращаемое значение относится к типу numeric для выражения типа integer или к типу double precision для выражения типа real. В остальных случаях тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT avg(cost) AS average_cost,
booktown-# avg(retail) AS average_price,
booktown-# avg(retail - cost) AS average_profit
booktown-# FROM stock:
average_cost | average_price | average_prof1t
24.8235294118 | 30.0088235294 5.1852941176
(1 row)
x>oktown=# SELECT avg(cost)
AS average_cost, p.name AS publisher
booktown-# FROM stock JOIN editions USING (isbn))
booktown-l JOIN publishers AS p (publisheMd)
booktown-# USING (publisheMd)
booktown-# GROUP BY p.name;
average_cost | publisher
26.5000000000 | Ace Books
19.0000000000 | Books of Wonder
26.5000000000 I Doubleday
25.0000000000 | HarperCollins
18.0000000000 | Henry Holt & Company. Inc.
23.0000000000 I Kids Can Press
23.0000000000 | Mojo Press
20.0000000000 I Penguin
23.0000000000 Random House
26.5000000000 | Roc
26.0000000000 | Watson-Guptill Publications
(11 rows)
count()
Синтаксис:
count(выражение)
Функция countO возвращает количество значений, для которых выражение отлично от NULL. Тип выражения не ограничивается. Следует помнить, что функция count () подсчитывает только значения, отличные от NULL, поэтому для получения осмысленных результатов используемое выражение не должно возвращать NULL для подсчитываемых записей.
Если при вызове count() передается символ *, функция просто подсчитывает все записи, в том числе и содержащие NULL.
Примеры
booktown=# SELECT countC*) FROM editions;
count
17
(1 row)
booktown=# SELECT count(isbn). p.name
booktown-# FROM editions JOIN publishers AS p (publisheMd)
booktown-# USING (publisheMd)
booktown-# GROUP BY p.name
booktown-# ORDER BY count DESC;
count | name
3 | Random House
2 | Ace Books
2 | Doubleday
2 Roc
1 | Books of Wonder
1 | HarperCollins
1 | Henry Holt & Company. Inc.
1 | Kids Can Press
1 | Mojo Press
1 | O'Reilly & Associates
1 | Penguin
1 | Watson-Gupti11 Publications
(12 rows)
max()
Синтаксис:
max(выражение)
Функция max() возвращает максимальное значение заданного выражения в группе. Результатом выражения может быть значение любого числового или строкового типа, а также типа даты или времени. Тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT max(cost), max(retail) FROM stock;
max max
36.00 I 46.95
(1 row)
booktown=# SELECT max(retail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p (publisher_id)
booktown-# USING (publisherjd)
booktown-# GROUP BY p.name
booktown-# ORDER BY max DESC;
max | name
46.95 | Roc
45.95 i Ace Books 36.95 Doubleday 32.95
Random House 28.95 HarperCollins
28.95 I Watson-Guptill Publications
24.95 | Mojo Press
24.95 | Penguin
23.95 1 Henry Holt & Company. Inc. 23.95
Kids Can Press 21.95 Books of Wonder
(11 rows)
min()
Синтаксис:
min (выражение)
Функция min() возвращает минимальное значение заданного выражения в группе. Результатом выражения может быть значение любого числового или строкового типа, а также типа даты или времени. Тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT min(cost). min(retail) FROM stock;
min | min
16.00 16.95
(1 row)
booktown=# SELECT min(retail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p (publisheMd)
booktown-# USING (publisheMd)
booktown-l GROUP BY p.name
booktown-# ORDER BY min ASC;
miP 1 ..mme._
16.95 | Random House
21.95 Ace Books
21.95 I Books of Wonder
22.95 | Roc
23.95 | Henry Holt & Company. Inc.
23.95 | Kids Can Press
24.95 | Mojo Press
24.95 I Penguin
28.95 | Doubleday
28.95 I HarperCollins
28.95 | Watson-Guptill Publications
(11 rows)
stddev()
Синтаксис:
stddev(выражение)
Функция stddev О получает выражение, описывающее значения любого числового типа (numeri с, bigi nt, smal 1 i nt, real или doubl e preci si on), и возвращает среднеквадратичное отклонение для группы. Для вещественных выражений результат возвращается в виде значения типа double precision, а для остальных типов —в виде значения типа numeric.
Примеры
booktown=# SELECT stddev(retail) FROM stock;
stddev
8.46
(1 row)
booktown=# SELECT stddev(retail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p ON (publisheMd = p.id)
booktown-# GROUP BY p.name
booktown-# ORDER BY stddev DESC
booktown-# LIMIT 4:
stddev | name
16.97 | Ace Books
16.97 | Roc 8.02 Random House
5.66 | Doubleday
(4 rows)
sum()
Синтаксис:
sum (выражение)
Функция sum() получает выражение, описывающее значения любого числового типа (numeric, bigint, smallint, real или double precision), и возвращает сумму значений в группе. Для выражений типа integer результат возвращается в виде значения типа numeric, а для выражений типа real — в виде значения типа double precision. В остальных случаях тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT sum(stock) FROM stock;
sum
"BOB"
(1 row)
booktown=# SELECT sum(stock). s.subject
booktown-# FROM ((stock NATURAL JOIN editions)
booktown(# JOIN books ON (books.id = bookjd))
booktown-f JOIN subjects AS s
booktown-# ON (books.subject_id = s.id)
booktown-# GROUP BY s.subject
booktown-# ORDER BY sum DESC;
189 | Horror
166 I Science Fiction
91 | Children's Books
28 | Drama
18 | Classics
16 | Arts
(6 rows)
variance()
Синтаксис: variance(выражение)
Функция variance() получает выражение, описывающее значения любого числового типа (numeric, bigint, small int, real или double precision), и возвращает дисперсию для группы (stddevO в квадрате). Для вещественных выражений результат возвращается в виде значения типа double precision, а для остальных типов — в виде значения типа numeric.
Примеры
booktown=# SELECT variance(retaiT) FROM stock;
variance
71.60
(1 row)
booktown=# SELECT varianceCretail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p
booktown-# ON (editions.pub!isher_id = p.id)
booktown-# GROUP BY p.name
booktown-# ORDER BY variance DESC
booktown-# LIMIT 4: variance name
288.00 | Ace Books 288.00 I Roc 64.33 !
Random House 32.00 | Doubleday
(4 rows)