From: | Merlin Moncure <mmoncure(at)gmail(dot)com> |
---|---|
To: | Adam Rich <adam(dot)r(at)sbcglobal(dot)net> |
Cc: | postgresql Forums <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: calling a function over several rows |
Date: | 2009-11-17 12:36:40 |
Message-ID: | b42b73150911170436r11ef2403m9959259d6033e128@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Tue, Nov 17, 2009 at 1:35 AM, Adam Rich <adam(dot)r(at)sbcglobal(dot)net> wrote:
> Merlin Moncure wrote:
>>
>> On Tue, Nov 17, 2009 at 1:02 AM, Adam Rich <adam(dot)r(at)sbcglobal(dot)net> wrote:
>>>
>>> Hello,
>>> There is an existing function which takes an integer and returns a
>>> record.
>>> I need to call this function with every integer in a table. Is there a
>>> simple shortcut for doing this?
>>>
>>> I'm looking for something like:
>>>
>>> select f.*
>>> from function(t.value) f, table t
>>
>> select (f).* from (select function(t.value) as f from table t) q;
>>
>> merlin
>>
>
> Thanks, that's perfect, and much faster than the one I came up with in the
> interim:
>
> select (f(t.value)).* from table t;
Your version is basically correct. It's slower because of a nasty
gotcha that is stemming from the fact that ().* is not really an
operator. It is expanded during parsing so that for each field of
your type, the function is run, like this:
select (f(t.value)).* from table t;
select f(t.value).a, f(t.value).b, f(t.value).c from table t;
I've griped about this a few times, but I don't know if it's fixable
or even broken...it's just something you have to watch out for.
merlin
From | Date | Subject | |
---|---|---|---|
Next Message | Geoffrey | 2009-11-17 13:39:33 | WAL file question |
Previous Message | Richard Huxton | 2009-11-17 11:38:22 | Re: Can anyone help setting up pgbouncer? |