Re: How to refer to computed columns from other computed columns?

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Matthew Wilson <matt(at)tplus1(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: How to refer to computed columns from other computed columns?
Date: 2010-08-16 14:26:36
Message-ID: 3971.1281968796@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Matthew Wilson <matt(at)tplus1(dot)com> writes:
> All I can come up with so far is to use a view and then another view on
> top of that one:

Note that you don't actually need a view, as you can just write the
subselect in-line:

select a, b, c,
case when c < 0 then 'no'
else 'yes'
end as d
from (select a, b, a - b as c from foo) as v1;

This is the standard method for avoiding repeat calculations in SQL.

One thing to keep in mind is that the planner will usually try to
"flatten" a nested sub-select (and whether it was written out manually
or pulled from a view does not matter here). This will result in the
sub-select's expressions getting inlined into the parent, so that the
calculations will actually get done more than once. If you're trying
to reduce execution time not just manual labor, you may want to put an
"offset 0" into the sub-select to create an optimization fence. But
test whether that really saves anything --- if there are bigger joins
or additional WHERE conditions involved, you can easily lose more than
you gain by preventing flattening.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Eric Ndengang 2010-08-16 14:46:30 Re: How to refer to computed columns from other computed columns?
Previous Message Matthew Wilson 2010-08-16 12:45:38 How to refer to computed columns from other computed columns?