Как привести сущность для установки в PostgreSQL

Используя Postgres 9.3, я обнаружил, что могу выполнить что-то вроде этого:

SELECT generate_series(1,10);

Но я не могу сделать это:

SELECT (SELECT generate_series(1,10));

Могу ли я как-нибудь привести результат SELECT к setof int использовать его так же, как результат generate_series()?

Что именно там происходит, почему я могу использовать результат из функции, а не из SELECT?

1 ответ

Решение

Ваша первая форма - нестандартная особенность Postgres. Это позволяет SRF (Set Returning Functions) в SELECT список, который расширяется до нескольких строк:

Примечание: это работает для функций, а не для подвыборов. Вот почему ваш второй SELECT это просто неверный синтаксис.

В стандартном SQL этого не предусмотрено, поэтому некоторые функции не одобряются, и были предоставлены чистые альтернативы (благодаря улучшениям в стандарте SQL). Это в значительной степени заменено LATERAL особенность в Postgres 9.3+:

Простую форму можно заменить на:

SELECT g
FROM   generate_series(1,10) g;

По возможности переместите SRF в FROM и относиться к ним как к таблицам - начиная с версии 9.3 это почти всегда возможно.

Обратите внимание, что g служит псевдонимом таблицы и столбца автоматически в примере. g в SELECT g привязывается к имени столбца первым. Более явный синтаксис:

SELECT g
FROM   generate_series(1,10) AS t(g);  -- table_alias(column_alias)

Вы должны понимать разницу между строкой, набором строк (~ таблицей) и массивом. Это даст вам массив целых чисел:

SELECT ARRAY(SELECT g FROM generate_series(1,10) g) AS g_arr;

Просмотрите теги /questions/tagged/generate-series и /questions/tagged/set-returning-functions для многих связанных ответов с примерами кода.

Другие вопросы по тегам