在POSTGRESQL的WHERE子句中使用别名列

我有这样的查询:

SELECT jobs.*, (CASE WHEN lead_informations.state IS NOT NULL THEN lead_informations.state ELSE ‘NEW’ END) as lead_state FROM “jobs” LEFT JOIN lead_informations ON lead_informations.job_id = jobs.id AND lead_informations.mechanic_id = 3 WHERE (lead_state = ‘NEW’)
这给出了以下错误:

PGError: ERROR: column “lead_state” does not exist LINE 1: …s.id AND lead_informations.mechanic_id = 3 WHERE (lead_state…
在MySql中这是有效的,但显然不是在Postgresql中。 从我可以收集,原因是查询的SELECT部分晚于WHERE部分评估。 这个问题有一个共同的解决方法吗?

正如你所经历的,MySQL的支持是非标准的。 正确的方法是重新打印SELECT子句中使用的同一个expression式:

SELECT jobs.*, CASE WHEN lead_informations.state IS NOT NULL THEN lead_informations.state ELSE ‘NEW’ END as lead_state FROM “jobs” LEFT JOIN lead_informations ON lead_informations.job_id = jobs.id AND lead_informations.mechanic_id = 3 WHERE lead_informations.state IS NULL
我在同一个问题上挣扎,“mysql语法不标准”在我看来不是一个有效的论点。 PostgreSQL也增加了方便的非标准扩展,例如“INSERT … RETURNING …”以在插入后获得自动ID。 此外,重复大型查询不是一个优雅的解决scheme。

但是,我发现WITH语句非常有帮助。 它有点像查询中创build一个临时视图,你可以像通常的表一样使用。 我不确定我是否正确地重写了JOIN,但总的来说,它应该像这样工作:

WITH jobs_refined AS ( SELECT jobs.*, (SELECT CASE WHEN lead_informations.state IS NOT NULL THEN lead_informations.state ELSE ‘NEW’ END) AS lead_state FROM jobs LEFT JOIN lead_informations ON lead_informations.job_id = jobs.id AND lead_informations.mechanic_id = 3 ) SELECT * FROM jobs_refined WHERE lead_state = ‘NEW’
你需要重复where子句中的case语句,或者我的首选项是做如下的事情:

SELECT * FROM ( SELECT jobs.*, (CASE WHEN lead_informations.state IS NOT NULL THEN lead_informations.state ELSE ‘NEW’ END) as lead_state FROM “jobs” LEFT JOIN lead_informations ON lead_informations.job_id = jobs.id AND lead_informations.mechanic_id = 3 ) q1 WHERE (lead_state = ‘NEW’)
我相信常用的解决scheme是使用一个内部SELECT作为计算(在这种情况下是CASE语句),以便内部SELECT的结果在执行到该查询时可用于整个外部查询。 否则,首先对WHERE子句进行求值,而对SELECT子句则一无所知。

我在这种情况下使用别名。 (INNER查询)。

Select “Vendors”.“VendorId”, “Vendors”.“Name”,“Result”.“Total” From (Select “Trans”.“VendorId”, (“Trans”.“A”+“Trans”.“B”+“Trans”.“C”) AS “Total” FROM “Trans” WHERE “Trans”.“Year”=2014 ) As “Result” JOIN “Vendors” ON “Result”.“VendorId”=“Vendors”.“VendorId” WHERE “Vendors”.“Class”=‘I’ AND “Result”.“Total” > 200

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值