PostgreSQL在select查询中重用计算结果

PostgreSQL在select查询中重用计算结果,sql,postgresql,Sql,Postgresql,例如,使用SQL,我可以执行以下操作: SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100; 使用Postgres有什么方法可以做到这一点吗?这可能是您可以使用的另一种方法: SELECT foo.c FROM ( SELECT (a+b) as c FROM table ) as foo WHERE foo.c < 5 AND (foo.c*foo.c+t) > 100 从性能的角度来看,我

例如,使用SQL,我可以执行以下操作:

SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;

使用Postgres有什么方法可以做到这一点吗?

这可能是您可以使用的另一种方法:

SELECT foo.c
FROM (
    SELECT (a+b) as c FROM table
) as foo
WHERE foo.c < 5 
AND (foo.c*foo.c+t) > 100

从性能的角度来看,我认为这不是一个最佳的解决方案,因为foo子查询缺少WHERE子句,因此返回所有表记录。我不知道Postgresql是否在那里进行了一些查询优化。

你不能这样做。既不在PostgreSQL中,也不在标准SQL中

输出列的名称可用于引用中列的值 ORDER BY和GROUP BY子句,但不在WHERE或HAVING子句中; 在这里,你必须写出表达式

人们可以就这方面的标准进行辩论。休·达文(Hugh Darwen)在最近提到的《我》中做了大量的工作

您可以使用子查询,如,或类似的:

WITH cte AS (SELECT a + b AS c FROM x)
SELECT c
FROM   cte
WHERE  c < 5
AND    (c*c+t) > 100;

CTE对于更复杂的操作特别有用,或者如果您想在多个子查询中重用中间结果。

您不能只使用:从a+b<5和a+b*a+b+t>100的表中选择a+b;??我理解你建议的方式会更简单,但我只是尝试了一下,但没有效果。a+b只是一个例子,在我的例子中,这是使用PostGis进行距离计算。出于性能原因,我问这个问题的唯一原因是,我认为在同一个查询中多次执行距离计算一点也不好是的,postgresql将认识到foo.c<5实际上是table.a+table.b<5。如果您将其设置为测试并在a+b上创建索引,您将看到+b@YuriBarbashov可能最好的方法是将计算包装在一个函数中,并让它生成信息以查看它被调用了多少次。您也可以尝试以这种方式设置稳定与不可变属性。此外,请尝试pgAdmin中的Explain Query函数来确认@araqnid commenti,我只是在100000条记录数据库上测试了它,查询时间与函数数量成正比call@YuriBarbashov:在MySQL中,有很多东西都能很好地工作-除非它们不能: