Tips for re-using function results within single insert

Started by Chris Gamacheover 23 years ago3 messagesgeneral
Jump to latest
#1Chris Gamache
cgg007@yahoo.com

using this table:
create table test_table (a text, b text);

This would be nice to be able to do...

insert into test_table (a,b) select random()::text as "myrandom",
encode("myrandom",'base64');

Any ideas on how to accomplish this without

create table test_table (id serial, a text, b text);

insert into test_table (a) values (random()::text);
update test_table set b=encode(a,'base64') where id = currval('id_seq');

CG

__________________________________________________
Do you Yahoo!?
New DSL Internet Access from SBC & Yahoo!
http://sbc.yahoo.com

#2Richard Huxton
dev@archonet.com
In reply to: Chris Gamache (#1)
Re: Tips for re-using function results within single insert

On Friday 20 Sep 2002 5:52 pm, Chris Gamache wrote:

This would be nice to be able to do...

insert into test_table (a,b) select random()::text as "myrandom",
encode("myrandom",'base64');

Well, I'd be tempted to write a wrapper function tagged as "iscachable" and
call it with a parameter of the current transaction-id (see docs on trigger
functions) or current time (the one from now() which doesn't change per
transaction). If this gives you grief, try a standard constant.

This means PG will cache results as long as the parameter doesn't change, in
this case for the duration of the transaction.

HTH

- Richard Huxton

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Richard Huxton (#2)
Re: Tips for re-using function results within single insert

On Friday 20 Sep 2002 5:52 pm, Chris Gamache wrote:

This would be nice to be able to do...

insert into test_table (a,b) select random()::text as "myrandom",
encode("myrandom",'base64');

You can do this sort of thing with a level of subselect:

insert into test_table (a,b)
select myrandom, encode(myrandom, 'base64')
from (select random()::text as myrandom) ss;

Trying to let one SELECT output expression refer to another one on the
same level strikes me as a really bad idea, though.

regards, tom lane