Иллюстрированный самоучитель по PostgreSQL

CREATE AGGREGATE

Агрегатная функция состоит из одной или двух обычных функций: обязательной переходной функции (функция) и необязательной завершающей функции (завершающая _функция).

PostgreSQL использует временную переменную типа переходный_тип, которая обновляется переходной функцией для каждой входной записи. Если в команде CREATE AGGREGATE определена завершающая функция, то после обработки всех данных она будет вызвана для вычисления окончательного результата. В противном случае возвращается итоговое значение переходной переменной без дополнительной обработки.

Команда CREATE AGGREGATE также может задать исходное состояние внутренней переходной переменной; для этой цели используется ключевое слово INITCOND. PostgreSQL хранит это значение в базе данных в виде типа text, однако оно должно представлять константу переходного типа, заданного с ключевым словом STYPE. Если параметр не задан, он инициализируется псевдозначением NULL.

Если переходная функция была создана с атрибутом isstrict (см. описание команды CREATE FUNCTION), она не может вызываться с параметром NULL. Если переходная функция объявлена подобным образом, выполнение агрегатной функции отличается от обычного – все входные параметры NULL игнорируются, и функция для них не вызывается. При этом сохраняется предыдущее переходное значение, а агрегатная функция продолжает обработку входных данных.

Кроме того, если промежуточная переменная была инициализирована псевдозначением NULL, она заменяется первым входным значением, отличным от NULL, а переходная функция вызывается для второго входного значения, отличного от NULL. Эта особенность может пригодиться для создания агрегатных функций, аналогичных функции max().

Обратите внимание: это происходит только в том случае, если входной_тип и переходный_гпип совпадают. Если типы различаются, вы должны либо передать начальное значение, отличное от NULL, либо использовать переходную функцию без атрибута isstrict.

Если переходная функция не объявлена с атрибутом isstrict, она вызывается для каждого входного значения без исключений. При этом у программиста появляется возможность самостоятельно организовать обработку псевдозначеннй NULL во входных данных.

Если завершающая функция объявлена с атрибутом isstrict, она не будет вызываться в том случае, если итоговое переходное состояние равно NULL; вместо этого автоматически выводится результат NULL.

Пример

В следующем примере определяется агрегатная функция sum (), работающая с текстовыми данными. Она вызывает встроенную функцию PostgreSQL textcat (text, text) для конкатенации всего текста во входных данных.

booktown=# CREATE AGGREGATE sum (BASETYPE = text,
booktown(# SFUNC = textcat,
booktown(# STYPE = text,
booktown(# INITCOND = ");
CREATE
booktown=# SELECT sum(title || ' ') FROM books WHERE title – '^L';
sum
-----------------------------------
Little Women Learning Python
(1 row)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.