PostgreSQL不接受WHERE子句中的列别名
关于连接3个不同的表,答案如下: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
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