Как привести сущность для установки в 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 для многих связанных ответов с примерами кода.