sql - 为什么 postgresql case 语句的结果在 where 子句中不起作用
问题描述
我正在解决这个站点中的 PostgreSQL 问题。
我的回答是:
select concat(mem.firstname, ' ', mem.surname), fac.name as facility,
case when mem.memid=0 then bks.slots*fac.guestcost
else bks.slots*membercost
end as cost
from cd.members mem
inner join cd.bookings bks on mem.memid=bks.memid
inner join cd.facilities fac on bks.facid=fac.facid
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
了cost > 30
insideWHERE
子句的错误。如果在cost
里面工作ORDER BY
,那为什么它在里面不工作WHERE
?
解决方案
这是对的。您不能使用在 中定义的列SELECT
别名WHERE
。简单的解决方案是使用横向连接来定义列别名:
select concat(mem.firstname, ' ', mem.surname), fac.name as facility,
v.cost
from cd.members mem join
cd.bookings bks
on mem.memid = bks.memid join
cd.facilities fac
on bks.facid=fac.facid cross join
(values (case when mem.memid = 0 then bks.slots * fac.guestcost
else bks.slots * membercost
end)
) v(cost)
where bks.starttime >= '2012-09-14' and bks.starttime < '2012-09-15' and
v.cost > 30
order by v.cost desc;
推荐阅读
- python - Matplotlib 图到轴
- python-3.x - 使用 Python 在特定行中删除具有特定字符串的列
- html - 为什么带有文本的 div 不适合文本尺寸?
- python - 根据存在 Pandas 添加行
- html - 带有特殊字符\n \r的HTML代码,如何正确显示
- sql-server - 在 sql server 升级之前要检查哪些所有配置?
- android - 如何知道android项目构建是由Android Studio还是命令行触发的?
- php - json_decode 使用经过验证的 json 数据返回 NULL,错误:“控制字符错误,可能编码不正确”
- http - 使用特定证书加密网站链接
- ajax - Symfony 表单返回 CSRF 令牌对 AJAX 请求无效