Обсуждение: [NOVICE] what does t(x) in select x from generate_series(1, 10) as t(x) stand for?

Поиск
Список
Период
Сортировка

[NOVICE] what does t(x) in select x from generate_series(1, 10) as t(x) stand for?

От
john snow
Дата:
is 
select x from generate_series(1, 10) as t(x);
different from
select x from generate_series(1, 10) as x;

both statements seem to produce the same result in pgAdmin4 (i'm using postresql version 10)

thanks for helping!

Re: [NOVICE] what does t(x) in select x from generate_series(1, 10)as t(x) stand for?

От
"David G. Johnston"
Дата:
On Wednesday, November 8, 2017, john snow <ofbizfanster@gmail.com> wrote:
is 
select x from generate_series(1, 10) as t(x);
different from
select x from generate_series(1, 10) as x;

both statements seem to produce the same result in pgAdmin4 (i'm using postresql version 10)


Not sure about the pgAdmin part but t(x) means that you are aliasing the table result of the generate_series call to the name "t" and that tables' first (and in this case only) column is aliased to the name "x".   The x in the select is then that first column.  In the "as x" variant all you've done is alias the table to the name "x" and the "x" in the select refers to the table.  Not able to confirm right now but the first result should yield a column of type bigint while the second should a composite whose only column is a bigint and whose name is "generate_series".  There may be something special for "SETOF type" results but if your function is "returns table(...)" the distinction definitely matters.

David J.

Re: [NOVICE] what does t(x) in select x from generate_series(1, 10) as t(x) stand for?

От
Tom Lane
Дата:
"David G. Johnston" <david.g.johnston@gmail.com> writes:
> On Wednesday, November 8, 2017, john snow <ofbizfanster@gmail.com> wrote:
>> is
>> select x from generate_series(1, 10) as t(x);
>> different from
>> select x from generate_series(1, 10) as x;

> Not sure about the pgAdmin part but t(x) means that you are aliasing the
> table result of the generate_series call to the name "t" and that
> tables' first (and in this case only) column is aliased to the name "x".

Right.

>   The x in the select is then that first column.  In the "as x" variant all
> you've done is alias the table to the name "x" and the "x" in the select
> refers to the table.  Not able to confirm right now but the first result
> should yield a column of type bigint while the second should a composite
> whose only column is a bigint and whose name is "generate_series".

Not sure offhand what happens for a function-returning-composite, but
I'm pretty sure that if the function returns a scalar type, then
SELECT ... from f(...) as x;

is treated the same as
SELECT ... from f(...) as x(x);

Experimentally, these all produce identical results:

select x from generate_series(1, 10) as x;
select x.x from generate_series(1, 10) as x;
select x.* from generate_series(1, 10) as x;

which seems to confirm that.
        regards, tom lane


-- 
Sent via pgsql-novice mailing list (pgsql-novice@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-novice