В PostgreSQL вы можете использовать выражение VALUES для создания встроенной таблицы:
VALUES вычисляет значение строки или набор значений строки, заданных выражениями значения. Чаще всего он используется для генерации «таблицы констант» в более крупной команде , но может использоваться сам по себе.
Акцент мой. Затем вы можете применить свою агрегатную функцию к этой «константной таблице»:
select avg(x)
from (
values (1.0), (2.0)
) as t(x)
Или просто select expr
, если expr
не является агрегатной функцией:
select sin(1);
Вы также можете определить свою собственную функцию avg
, которая работает с массивом, и скрыть свой FROM внутри функции:
create function avg(double precision[]) returns double precision as $$
select avg(x) from unnest($1) as t(x);
$$ language 'sql';
А потом:
=> select avg(array[1.0, 2.0, 3.0, 4.0]);
avg
-----
2.5
Но это просто глупо, если вы не делаете это довольно часто.
Кроме того, если вы используете 8.4+, вы можете написать variadic functions и покончить с массивом. Внутренние компоненты те же, что и в версии массива, вы просто добавляете variadic
в список аргументов:
create function avg(variadic double precision[]) returns double precision as $$
select avg(x) from unnest($1) as t(x);
$$ language 'sql';
А затем вызвать его без массива:
=> select avg(1.0, 1.2, 2.18, 11, 3.1415927);
avg
------------
3.70431854
(1 row)
Благодаря depesz за указатель поворота через Google на поддержку функций с переменными числами в PostgreSQL.