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

news/2024/11/15 7:24:10/

我有这样的查询:

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


http://www.ppmy.cn/news/183310.html

相关文章

java-Lambde和方法引用

java-Lambde和方法引用 一、Lambda表达式 1.1 Lambda标准格式 格式: ​ (形参) -> {代码块} 形参:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可 ->:由英文中画线和大于符号组成&#…

Rust每日一练(Leetday0019) 跳跃游戏、合并区间、插入区间

目录 55. 跳跃游戏 Jump Game 🌟🌟 56. 合并区间 Mmerge Intervals 🌟🌟 57. 插入区间 Insert Interval 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专…

为什么陶瓷板视觉技术会越来越受到人们的青睐?

随着科技的不断进步和应用,陶瓷板视觉技术越来越受到人们的青睐。陶瓷板视觉技术是一种新型的非接触式检测技术,它可以在生产过程中对产品进行高效、准确的检测和质量控制。下面我们来详细了解一下陶瓷板视觉技术的优势和应用。 一、优势 1.高效性 陶…

Java网络Socket编程-websocket

实现一个用于监测 WebSocket 连接状态的线程类,其作用是通过创建一个 WebSocket 客户端,连接到指定的 WebSocket 地址,并监测连接的状态。 代码中的 WebSocketThread 类继承自 Thread,意味着它可以在单独的线程中执行。该线程类使…

Apple iPhone

苹果手机型号: M-零售机,N-官换机,F-官翻机,3A-演示机ZA/ZP-港版,LL-美版,KH-韩版,TA-台版

[经验教程]iPhone苹果手机NFC功能在哪里能找到怎么开启苹果iPhone手机NFC功能?

iPhone苹果手机NFC功能怎么开启? 1、在iPhone苹果手机上找到苹果iPhone手机设置; 2、打开iPhone苹果手机设置,找到通用; 3、在iPhone苹果手机设置的通用内可找到NFC功能; 4、苹果iPhone手机NFC功能默认关闭&#xff0…

[经验教程]iPhone苹果手机iOS系统App Store怎么下载手机APP到苹果iPhone手机?

iPhone苹果手机下载软件的app叫App Store除越狱的苹果iPhone手机外,想要下载APP到iPhone苹果手机上只能通过苹果iPhone手机上的APP Store搜索找到并下载到苹果手机。 iPhone苹果手机iOS系统怎么下载手机APP到苹果iPhone手机? 1、打开iPhone苹果手机找到…

iphone苹果手机定位在哪里打开设置

在日常生活中我们很多地方都需要用到手机进行定位,诸如网络打车、旅游出行、自驾游、单车定位导航线路等等,那么苹果手机的定位如何开启呢?以下是天天做出的经验分享,希望能帮助到需要用到它的朋友们。 以下是以iphone手机截图为例…