In questo pgexercises di aderire 3 tavoli diversi, la risposta è data come segue:PostgreSQL non accetta colonna alias nella clausola WHERE
select mems.firstname || ' ' || mems.surname as member,
facs.name as facility,
case
when mems.memid = 0 then
bks.slots*facs.guestcost
else
bks.slots*facs.membercost
end as cost
from
cd.members mems
inner join cd.bookings bks
on mems.memid = bks.memid
inner join cd.facilities facs
on bks.facid = facs.facid
where
bks.starttime >= '2012-09-14' and
bks.starttime < '2012-09-15' and (
(mems.memid = 0 and bks.slots*facs.guestcost > 30) or
(mems.memid != 0 and bks.slots*facs.membercost > 30)
)
order by cost desc;
Perché non è possibile fare riferimento alla alias cost
nella lista SELECT
in la clausola WHERE
?
Se corro la stessa query con:
...
where
bks.starttime >= '2012-09-14' and
bks.starttime < '2012-09-15' and
cost > 30
order by cost desc;
un errore si è verificato:
ERROR: column "cost" does not exist
E 'chiaro con me da this answer che è a causa del l'ordine di valutazione. Ma perché è consentito order by cost desc;
?
Vide [concettuale Ordine di Valutazione di un Select] (http://tinman.cs.gsu.edu/~raj/sql /node22.html). – klin
all'inizio ho frainteso la tua domanda :) ora mi trovo completamente d'accordo con la dichiarazione sopra –
L'alias di costo non esiste prima che il recordset venga restituito quando viene applicata l'istruzione where.dove l'istruzione ORDER BY viene applicata dopo che è stato creato il recordset, il che significa che l'alias della colonna è quindi disponibile. – Matt