2016-06-26 2 views
6

В этом pgexercises о присоединении 3 различных таблиц, ответ дается следующим образом:PostgreSQL не принимает псевдоним столбца в ИНЕКЕ

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; 

Почему я не могу ссылаться на cost псевдоним в списке SELECT в статья WHERE?
Если я запускаю тот же запрос с:

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

возникает ошибка:

ERROR: column "cost" does not exist 

Это ясно со мной из this answer, что это из-за порядка оценки. Но почему допустимо order by cost desc;?

+2

Vide [Концептуальный Порядок оценки в Select Заявление] (http://tinman.cs.gsu.edu/~raj/sql /node22.html). – klin

+0

сначала я неправильно понял ваш вопрос :) теперь я полностью согласен с утверждением выше –

+2

Алиас стоимости не существует до того, как возвращается набор записей, когда применяется оператор where.где, поскольку оператор ORDER BY применяется после создания набора записей, это означает, что тогда используется псевдоним столбца. – Matt

ответ

10

Вы задаете два вопроса:
1.

Почему я не могу ссылаться на SELECT, псевдоним затрат на ИНЕКЕ?

2.

Но почему заказ по стоимости по алфавиту; позволено?


manual has an answer for both of them here:

Имя выходной столбца может быть использован для обозначения значения столбца в ORDER BY и GROUP BY положений, но не в WHERE или HAVING положений; там вы должны выписать выражение вместо этого.

Это определяется стандартом SQL и причиной этого является последовательность событий в SELECT запросе. В то время, когда применяются предложения WHERE, выходные столбцы в списке SELECT еще не вычислены. Но когда дело доходит до ORDER BY, выходные столбцы легко доступны.

Так что, хотя это неудобно и сбивает с толку сначала, это все еще имеет смысл.

Похожие:

Смежные вопросы