Re: How to access multicolumn function results?

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: How to access multicolumn function results?
Дата
Msg-id 17722.1358991767@sss.pgh.pa.us
обсуждение исходный текст
Ответ на How to access multicolumn function results?  (Andreas <maps.on@gmx.net>)
Список pgsql-sql
Andreas <maps.on@gmx.net> writes:
> SELECT some_fct( some_id ) FROM some_other_table;
> How can I split this up to look like a normal table or view with the 
> column names that are defined in the RETURNS TABLE ( ... ) expression of 
> the function.

The easy way is
SELECT (some_fct(some_id)).* FROM some_other_table;

If you're not too concerned about efficiency, you're done.  However this
isn't very efficient, because the way the parser deals with expanding
the "*" is to make N copies of the function call, as you can see with
EXPLAIN VERBOSE --- you'll see something similar to
Output: (some_fct(some_id)).fld1, (some_fct(some_id)).fld2, ...

If the function is expensive enough that that's a problem, the basic
way to fix it is
SELECT (ss.x).* FROM (SELECT some_fct(some_id) AS x FROM some_other_table) ss;

With a RETURNS TABLE function, this should be good enough.  With simpler
functions you might have to insert OFFSET 0 into the sub-select to keep
the planner from "flattening" it into the upper query and producing the
same multiple-evaluation situation.
        regards, tom lane



В списке pgsql-sql по дате отправления:

Предыдущее
От: Andreas
Дата:
Сообщение: How to access multicolumn function results?
Следующее
От: Kong Man
Дата:
Сообщение: Writeable CTE Not Working?