2015-03-25 3 views
1

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

SELECT generate_series(1,10); 

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

SELECT (SELECT generate_series(1,10)); 

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

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

+0

Придумал сумасшедшую идею: 'SELECT UNNEST (ARRAY (SELECT generate_series (1,10)));' У кого-то есть лучшее решение? – Logman

ответ

3

Ваша первая форма является нестандартной функцией Postgres. Это позволяет SRF (набор функций, возвращающих) в SELECT списке, которые разлагаются в несколько строк:

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

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

Простая форма может быть заменена на:

SELECT g 
FROM generate_series(1,10) g; 

Всякий раз, когда это возможно перемещение ОСР в пункте 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; 

просмотреть теги и для многих связанных ответов с примерами кода.

+0

Но как результат SELECT отличается от результата generate_series? – Logman

+0

@Logman: Postgres имеет нестандартную функцию, позволяющую использовать SRF (функции!) В списке SELECT (который в настоящее время сбрасывается и заменяется стандартным синтаксисом).Он не разрешает (и никогда не допускает) подвыборки в списке SELECT, хотя и возвращает более одной строки или более одного столбца. –

+0

Я знаю, что вы хотите убедить меня использовать множество после FROM, и я фактически использую его так. Но по академическим причинам я хотел бы добавить эту функцию для SELECT. Как это возможно? – Logman

Смежные вопросы