Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL-使用以前从同一查询计算的值_Sql_Postgresql - Fatal编程技术网

PostgreSQL-使用以前从同一查询计算的值

PostgreSQL-使用以前从同一查询计算的值,sql,postgresql,Sql,Postgresql,我有以下sql查询: SELECT (SELECT ...) AS X, (SELECT ...) AS Y from my_table “X”很难计算,它被用作计算Y的输入。但是,如果我试图在计算Y的查询中,甚至在主查询中引用X,我会收到以下错误消息: Error: column "X" does not exist 一旦计算出X,有没有办法引用它?我真的不想计算两次,因为这似乎效率很低。您最好的选择可能是运行SELECT。。。首先作为查询的X部分,将其结果存储在临时表中。然后在主查询中使

我有以下sql查询:

SELECT (SELECT ...) AS X, (SELECT ...) AS Y from my_table
“X”很难计算,它被用作计算Y的输入。但是,如果我试图在计算Y的查询中,甚至在主查询中引用X,我会收到以下错误消息:

Error: column "X" does not exist

一旦计算出X,有没有办法引用它?我真的不想计算两次,因为这似乎效率很低。

您最好的选择可能是运行SELECT。。。首先作为查询的X部分,将其结果存储在临时表中。然后在主查询中使用该临时表。

子选择可能会为您执行此操作,例如:

select *, hard_to_compute * 2 as using_hard_to_compute \
from (select *, (i * i) as hard_to_compute from foo) bar;

 i | hard_to_compute | using_hard_to_compute 
---+-----------------+-----------------------
 1 |               1 |                     2
 2 |               4 |                     8
 3 |               9 |                    18

当然,我不难计算。在这个例子中,我只是假装是这样。

PostgreSQL通常非常聪明,不必对同一事物进行两次计算。这样的查询

SELECT (SELECT hard_to_compute FROM whatever) AS X,
       (SELECT hard_to_compute FROM whatever)*2 AS Y 
FROM my_table
应该只需要运行两个子查询一次。但是,如果查询是

SELECT (SELECT hard_to_compute FROM whatever) AS X,
       (SELECT hard_to_compute*2 FROM whatever) AS Y 
FROM my_table
那么,对于乐观主义者来说,这可能更难看出两个查询中的相同之处


另一种处理方法是创建一个稳定函数来计算X。只要输入相同,稳定函数总是在单个语句中返回相同的结果,因此Postgres知道它只需要运行一次。请参阅。

您知道它实际上被“计算”了两次吗?临时表的速度很慢,应该是最后的选择。这很容易转换为使用子选择,避免将所有内容拖放到临时区域。