2016-06-26 36 views
6

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;?

+2

Vide [concettuale Ordine di Valutazione di un Select] (http://tinman.cs.gsu.edu/~raj/sql /node22.html). – klin

+0

all'inizio ho frainteso la tua domanda :) ora mi trovo completamente d'accordo con la dichiarazione sopra –

+2

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

risposta

10

È porsi due domande:
1.

Perché non è possibile fare riferimento alla alias costo SELEZIONA alla clausola WHERE?

2.

Ma perché ORDER BY costo disc; È permesso?


Il

nome di una colonna di output manual has an answer for both of them here: può essere utilizzato per indicare il valore della colonna ORDER BY e GROUP BY clausole, ma non nelle WHERE o HAVING clausole; lì devi invece scrivere l'espressione.

'definito dallo standard SQL e la ragione è la sequenza di eventi in una query SELECT. Nel momento in cui vengono applicate le clausole WHERE, le colonne di output nell'elenco SELECT non sono ancora state calcolate. Ma quando si tratta di ORDER BY, le colonne di output sono prontamente disponibili.

Quindi, anche se questo è scomodo e confuso all'inizio, ha comunque un senso.

correlati: