2016-06-26 10 views
6

In diesem pgexercises über den Beitritt zu 3 verschiedene Tabellen akzeptieren, ist die Antwort wie folgt festgelegt:PostgreSQL nicht Spalte alias in WHERE-Klausel

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; 

Warum kann ich nicht beziehen sich auf die cost Alias ​​in der SELECT Liste in die WHERE Klausel?
Wenn ich die gleiche Abfrage mit laufen:

 ... 
     where 
     bks.starttime >= '2012-09-14' and 
     bks.starttime < '2012-09-15' and 
     cost > 30 
order by cost desc; 

ein Fehler auftritt:

ERROR: column "cost" does not exist 

es mit mir aus this answer klar ist, dass es wegen der Reihenfolge der Auswertung ist. Aber warum ist order by cost desc; erlaubt?

+2

Vide [Konzeptuell Reihenfolge der Auswertung eines Select-Anweisung] (http://tinman.cs.gsu.edu/~raj/sql /node22.html). – klin

+0

zuerst habe ich Ihre Frage missverstanden :) jetzt aggre ich vollständig mit Aussage über –

+2

Der Kosten-Alias ​​existiert nicht, bevor das Recordset zurückgegeben wird, wenn die Where-Anweisung angewendet wird.wo die ORDER BY-Anweisung angewendet wird, nachdem das Recordset erstellt wurde, was bedeutet, dass der Spaltenalias dann verfügbar ist. – Matt

Antwort

10

Sie stellen zwei Fragen:
1.

Warum in die SELECT-Kosten-Alias ​​kann ich nicht in der WHERE-Klausel verweisen?

2.

Aber warum, um nach Kosten ab; ist erlaubt?


Die manual has an answer for both of them here:

Der Name einer Ausgabespalte kann die Spaltenwert in ORDER BY und GROUP BY Klauseln, aber nicht in den WHERE oder HAVING Klauseln beziehen verwendet werden; Da muss man stattdessen den Ausdruck schreiben.

Es wird von dem SQL-Standard definiert und der Grund ist die Abfolge der Ereignisse in einer SELECT Abfrage. Zu dem Zeitpunkt, zu dem WHERE -Klauseln angewendet werden, wurden die Ausgabespalten in der SELECT-Liste noch nicht berechnet. Aber wenn es um ORDER BY geht, sind Ausgabespalten leicht verfügbar.

Obwohl dies zunächst unbequem und verwirrend ist, macht es immer noch Sinn.

Verwandte: