pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Christoph Haller <ch@rodos.fzk.de>
To: pgsql-sql@postgresql.org
Cc: pgsql-sql@seahat.com
Subject: Re: column label
Date: Wed, 26 Mar 2003 10:55:43 +0100
Message-ID: <3E81791F.8D120A60@rodos.fzk.de> (raw)

> >> Ok I have a query in a program that looks something like this
> >>
> >> select
> >>  reference_number as foo,
> >>  '(10,10)'::point <-> point(x,y) as distance
> >> from imagemap
> >>  where
> >>   index_number =3D '2322' and
> >>   block_number =3D '140'
> >>  order by distance
> >>  limit 1;
> >>
> >> I wanted to add a clause in where 'and distance < 30'
> >> but according to the postgres manual it says I cannot do that for
> >> WHERE or HAVING clauses, instead use the real name.
> >>
> >> However dropping the 'as distance' from my query gives me a column
> >> name of '?column?' which happens to not be worth a dang thing.
> >>
> >> How can it be done?
> >>
> >> (I suddenly have a feeling its going to require a subselect)
> > Your feeling is 50% accurate. If you want to use subselect, throw
"<10"
> > into this subselect, because you will have performance loss.
> >
> > You can also use whole function in where clause and order by:
> >   select
> >    reference_number as foo,
> >    '(10,10)'::point <-> point(x,y) as distance
> >   from imagemap
> >    where
> >     index_number =3D '2322' and
> >     block_number =3D '140'
> >    where '(10,10)'::point <-> point(x,y)<10
> >    order by '(10,10)'::point <-> point(x,y)
> >    limit 1;
> >
> Thats kind of a pain...  I'd rather perform the calculation once and
then
> do my order and where on the one value.  Is there any reason why
postgres
> does not recognize labels under WHERE?
>
So how about
select foo, distance from (
 select
  reference_number as foo,
  '(10,10)'::point <-> point(x,y) as distance
 from imagemap
  where
   index_number = '2322' and
   block_number = '140'
) as bar
where distance < 30
order by distance
limit 1;
The reason why postgres does not recognize labels under WHERE
is the WHERE clause is evaluated before column aliasing takes place.
But there is this valuable feature of using a sub-SELECT as
from_item, so this should not be a problem at all.
Alternatively you could use

 select
 reference_number,
 '(10,10)'::point <-> point(x,y)
from imagemap alias (foo, distance)
  where
   index_number = '2322' and
   block_number = '140' and distance < 30
  order by distance
  limit 1;

Does this help?

Regards, Christoph




view thread (4+ messages)

Message-ID: <3E81791F.8D120A60@rodos.fzk.de>
Permalink:  ../3E81791F.8D120A60@rodos.fzk.de/
Also on:    postgresql.org/message-id/3E81791F.8D120A60@rodos.fzk.de

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: ch@rodos.fzk.de, pgsql-sql@seahat.com
  Subject: Re: column label
  In-Reply-To: <3E81791F.8D120A60@rodos.fzk.de>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox