2016-06-26 58 views
6

在这种pgexercises有关加入3页不同的表,给出的答案是如下列别名:PostgreSQL不支持在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; 

为什么我不能指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

韦迪([SELECT语句的评估概念秩序] http://tinman.cs.gsu.edu/~raj/sql /node22.html)。 – klin

+0

起初我误解了你的问题:)现在我完全赞同上面的陈述 –

+2

当where语句被应用时返回记录集之前,成本别名不存在。在创建记录集之后应用ORDER BY语句意味着列别名可用。 – Matt

回答

10

您请教两个问题:
1.

为什么我不能指SELECT成本别名,在WHERE子句?

2.

但是,为什么为了通过成本递减;被允许?


manual has an answer for both of them here:

的输出列的名称可以被用来指代该列的值在 ORDER BYGROUP BY条款,而不是在WHEREHAVING 条款;那么你必须写出表达式。

它是由SQL标准定义,原因是在SELECT查询事件的顺序。在应用WHERE子句时,SELECT列表中的输出列尚未计算。但是,当涉及到ORDER BY时,输出列是随时可用的。

所以虽然起初这不方便和困惑,但它还是有道理的。

相关: