SQL: пропустите предложение FROM - PullRequest
2 голосов
/ 09 января 2012

Когда я хочу протестировать поведение некоторой функции PostgreSQL FOO(), я бы счел полезным выполнить запрос, подобный SELECT FOO(bar), бар - это некоторые данные, которые я использую в качестве прямого ввода, без необходимости SELECT отреальная таблица.

Я читал, что мы можем опустить предложение FROM в выражении типа SELECT 1, но я не знаю правильный синтаксис для нескольких входов.Я, например, пробовал SELECT AVG(1, 2), и он не работает.

Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 09 января 2012

В 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.

4 голосов
/ 09 января 2012

Чтобы выразить SET в большинстве разновидностей SQL, вам нужно на самом деле выразить таблицу ..

 SELECT
  AVG(inlineTable.val)
FROM
(
  SELECT 1 AS Val
  UNION ALL
  SELECT 2 AS Val
)
  AS inLineTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...