Thread: Joining with result of a plpgsql function

Joining with result of a plpgsql function

From
"Matthew T. O'Connor"
Date:
Hello,

I have a pl/pgsql function, defined as:

CREATE FUNCTION tms.get_tms_summary(id integer)  RETURNS tms.tms_summary

get_tms_summary returns a composite type, tms_summary, which is 
comprised of several numerics.

What I would like to do is something like:

select f.id, f.name, tms.get_tms_summary(f.id) from foo f;

However this returns only three columns, the third of which is the 
entire complex data type in one column.

I can do: select * from tms.get_tms_summary(99);

But I would really like to be able to combine it with other data and get 
a result set that looked like:

f.id, f.name, tms_summary.col1, tms_summary.col2 ...


Any thoughts or suggestions?


Thank you,

Matthew O'Connor



Re: Joining with result of a plpgsql function

From
Stephan Szabo
Date:
On Wed, 7 May 2008, Matthew T. O'Connor wrote:

> I have a pl/pgsql function, defined as:
>
> CREATE FUNCTION tms.get_tms_summary(id integer)
>    RETURNS tms.tms_summary
>
> get_tms_summary returns a composite type, tms_summary, which is
> comprised of several numerics.
>
> What I would like to do is something like:
>
> select f.id, f.name, tms.get_tms_summary(f.id) from foo f;
>
> However this returns only three columns, the third of which is the
> entire complex data type in one column.
>
> I can do: select * from tms.get_tms_summary(99);
>
> But I would really like to be able to combine it with other data and get
> a result set that looked like:
>
> f.id, f.name, tms_summary.col1, tms_summary.col2 ...

Well I thinkselect f.id, f.name, (tms.get_tms_summary(f.id)).* from foo f;
would expand it out into separate columns, but I think that might also
call it multiple times.  You might have better luck combining that with a
subquery likeselect id, name, (summary).col1, (summary).col2, ... from (select id, name, tms.get_tms_summary(f.id) as
summaryfrom foo) f;
 



Re: Joining with result of a plpgsql function

From
"Matthew T. O'Connor"
Date:
Stephan Szabo wrote:
> On Wed, 7 May 2008, Matthew T. O'Connor wrote:
>   
>> But I would really like to be able to combine it with other data and get
>> a result set that looked like:
>>
>> f.id, f.name, tms_summary.col1, tms_summary.col2 ...
>>     
>
> Well I think
>  select f.id, f.name, (tms.get_tms_summary(f.id)).* from foo f;
> would expand it out into separate columns, but I think that might also
> call it multiple times.  You might have better luck combining that with a
> subquery like
>  select id, name, (summary).col1, (summary).col2, ... from
>   (select id, name, tms.get_tms_summary(f.id) as summary from foo) f;

Ah, I knew there was an easy way to do it, I totally forgot / missed / 
didn't know about the (composite type).* syntax.

Thank you!