ijustlovemath Asked: 2024-02-22 22:50:46 +0800 CST2024-02-22 22:50:46 +0800 CST 2024-02-22 22:50:46 +0800 CST 有没有办法根据其他列的表达式来计算列? 772 我希望根据其他列的值选择一列。用例是我对复杂表达式的中间值感兴趣。 就像是: SELECT 1.0 as avg, 2.0 as stdev, 100.0*stdev/avg as cv; 使用 CTE 执行此操作的“正确”方法是吗? postgresql 2 个回答 Voted Best Answer tinlyx 2024-02-23T09:29:46+08:002024-02-23T09:29:46+08:00 很高兴看到出了什么问题: SELECT 1.0 as avg, 2.0 as stdev, 100.0*stdev/avg as cv; =# ERROR: column "stdev" does not exist LINE 1: SELECT 1.0 as avg, 2.0 as stdev, 100.0*stdev/avg as cv; 因此,PostgreSQL 错误表明该stdev列不存在。更准确/概念上来说,有一个逻辑执行顺序,其中 SQL 的各个部分都被评估。在这里,stdev在定义的同时对其求值,这是不行的。它必须事先定义。否则的话,此时“不存在” 。 正如您所怀疑的,您可以使用 CTE 强制stdev在使用前先定义: WITH t AS ( SELECT 1.0 as avg, 2.0 as stdev ) SELECT t.*, 100.0*stdev/avg as cv FROM t; 或者等效地使用子查询: SELECT t.*, 100.0*stdev/avg as cv FROM ( SELECT 1.0 as avg, 2.0 as stdev ) AS t; (子查询/内部查询在外部查询之前评估。) Ctx 2024-02-23T00:24:12+08:002024-02-23T00:24:12+08:00 不,CTE 在这方面对您没有帮助。MySQL 已经生成了列,这可能接近您想要的,但 PostgreSQL 缺乏该功能。您可以从您的选择中创建一个视图 CREATE VIEW somename AS SELECT ... 仅使用选择和投影的简单视图甚至是可更新的,附加字段也不会造成影响。
很高兴看到出了什么问题:
因此,PostgreSQL 错误表明该
stdev
列不存在。更准确/概念上来说,有一个逻辑执行顺序,其中 SQL 的各个部分都被评估。在这里,stdev
在定义的同时对其求值,这是不行的。它必须事先定义。否则的话,此时“不存在” 。正如您所怀疑的,您可以使用 CTE 强制
stdev
在使用前先定义:或者等效地使用子查询:
(子查询/内部查询在外部查询之前评估。)
不,CTE 在这方面对您没有帮助。MySQL 已经生成了列,这可能接近您想要的,但 PostgreSQL 缺乏该功能。您可以从您的选择中创建一个视图
仅使用选择和投影的简单视图甚至是可更新的,附加字段也不会造成影响。