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

news/2024/7/9 21:43:22 标签: postgresql, 数据库, mysql

我有这样的查询:

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.niftyadmin.cn/n/391089.html

相关文章

多AAR合并之二Merge multiple jar/aar maven url into one

前情提要 Merge multiple jar/aar file into single jar/aar, so no maven transitive. 场景是有个需求,需要输出一个sdk出去。 但是项目在前几篇博客的背景下,我已经实现了部分功能上gitlab maven了。 https://yeshen.blog.csdn.net/article/details/…

管理类联考•逻辑——解题技巧汇总

管理类联考•逻辑——解题技巧汇总 第一部分 形式逻辑 第1章 复言命题 母题1 充分与必要 充分条件 A是B的充分条件,记作A→B,读作“A推B”,是指假如事件A发生了,事件B一定发生。典型关联词: “如果…那么…。” 必要条件 A是B的必要条件,记作B→A,说明A的发生对于B的发生是…

synchronized 关键字

1. synchronized 关键字的作用 synchronized 关键字解决的是多个线程之间访问资源的同步性,用于保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。 2. 作用范围 修饰代码块:大括号括起来的代码,作用于调…

【已解决】Cmake编译Qt项目出现Qt5_dir-NOTFOUND

在使用Cmake导入项目源码后,点击configure的第一步配置阶段,会出现一些路径找不到的情况。这次的Qt项目就是这个问题。 一般的第三方库找到源路径比较好找,Qt这里的子路径比较多,需要选择到安装目录下的如下子路径,例如…

银行转账问题(死锁)

本文主要讲述死锁的一个经典案例—银行转账问题,并对该问题进行定位、修复。 1. 问题说明 当账户A对账户B进行转账时, 首先需要获取到两把锁:账户A和账户B的锁。获取两把锁成功,且余额大于0,则扣除转出人的余额&…

AWK常用用法

awk简介 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,…

提示工程师指南2-基础提示 Basic Prompting

基础提示 Basic Prompting 在上一篇指南中,我们介绍了并且提供了一个基本的 prompt 示例。 在这篇指南中,我们将提供更多的 prompt 使用示例,并介绍在更高级的指南中将会很重要的关键概念。 通常,学习概念的最佳方法是通过示例…

VMware SD-WAN 5.2 发布 - 软件定义的 WAN

VMware SD-WAN 5.2 发布 - 软件定义的 WAN SD-WAN 解决方案的领导者 请访问原文链接:https://sysin.org/blog/vmware-sd-wan-5/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 产品概述 软件定义的 WAN (SD-WAN)…