PostgreSQL中如何在SELECT新建列后通过WHERE进行过滤
报错原因
该报错是SQL执行顺序的特性导致的:SQL的执行顺序为 FROM -> WHERE -> SELECT,你在SELECT阶段定义的别名diff,在执行WHERE过滤的阶段还没有被系统解析,因此会提示列不存在。
可行的解决方法
方法1:直接在WHERE子句中重复计算逻辑
适合计算逻辑简单的场景,写法最直接:SELECT abs("c1" - "c2") as diff FROM table1 WHERE abs("c1" - "c2") < 3无需担心重复计算的性能损耗,绝大多数主流数据库的查询优化器会自动识别重复的计算逻辑,只会执行一次。
方法2:使用子查询封装计算结果
如果差值计算逻辑复杂,不想重复书写,可以用子查询先完成差值计算,外层查询再做过滤:SELECT diff FROM ( SELECT abs("c1" - "c2") as diff FROM table1 ) t WHERE diff < 3方法3:使用CTE(公用表表达式)
逻辑和子查询类似,可读性更高,更适合多层嵌套的复杂查询场景:WITH temp AS ( SELECT abs("c1" - "c2") as diff FROM table1 ) SELECT diff FROM temp WHERE diff < 3
内容的提问来源于stack exchange,提问作者Lucien S.
相关产品推荐
相关产品推荐

