首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL不接受WHERE子句中的列别名

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

Stack Overflow用户
提问于 2016-06-26 16:26:54
回答 1查看 8.6K关注 0票数 14

在这个关于连接三个不同表的动作练习中,答案如下:

代码语言:javascript
复制
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别名?

如果我在以下方面运行相同的查询:

代码语言:javascript
复制
        ...
        where
        bks.starttime >= '2012-09-14' and 
        bks.starttime < '2012-09-15' and
        cost > 30
order by cost desc;

发生错误:

错误:列“成本”不存在

这个答案我可以清楚地看到,这是因为评估的顺序。但是为什么允许order by cost desc;呢?

EN

回答 1

Stack Overflow用户

发布于 2016-06-26 20:40:04

你问两个问题:

1.

为什么我不能引用WHERE子句中的SELECT成本别名?

2.

但为什么允许按成本订货?

The 手册在这里给出了这两种方法的答案:

输出列的名称可以用于引用ORDER BYGROUP BY子句中的列的值,但不能引用WHEREHAVING子句中的列;必须在那里写出表达式。

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

因此,虽然这在一开始是不方便和令人困惑的,但它还是有意义的。

相关信息:

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38040631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档