PostgreSQL不接受WHERE子句中的列别名

PostgreSQL不接受WHERE子句中的列别名,sql,postgresql,alias,operator-precedence,Sql,Postgresql,Alias,Operator Precedence,关于连接3个不同的表,答案如下: 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

关于连接3个不同的表,答案如下:

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;
出现以下错误:

我很清楚,这是因为评估的顺序。但为什么要按成本来订购;允许吗?

您可以问两个问题: 一,

为什么我不能在WHERE子句中引用SELECT cost别名

二,

但为什么要按成本来订购;允许吗

输出列的名称可用于引用中列的值 ORDER BY和GROUP BY子句,但不在WHERE或HAVING中 条款;在这里,你必须写出表达式

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

所以,虽然这一点一开始很不方便,也让人困惑,但还是有点道理

相关的:


起初我误解了你的问题:现在我完全同意上面的语句,在应用where语句时返回记录集之前,成本别名不存在。其中,在创建记录集后应用ORDER BY语句,这意味着列别名随后可用。。。c1从t1开始,其中c1。。。进入选择。。。从选择。。。c1从t1到t2,其中t2.c1。。。。不确定这会如何影响性能。
        ...
        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