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

时间:2012-06-27 01:37:55

标签: sql postgresql

例如使用SQL我可以这样做:

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

使用Postgres有没有办法做到这一点?

2 个答案:

答案 0 :(得分:8)

你做不到。在PostgreSQL和标准SQL中都没有。我引用the manual here

  

输出列的名称可用于引用列的值   ORDER BYGROUP BY条款,但不在WHEREHAVING条款中;   那里你必须写出表达式。

人们可以就这方面的标准进行辩论。 Hugh Darwen实际上在this article我最近提到的那样做了很多。

您可以使用像Federico suggested这样的子查询,或像这样的Common Table Expression (CTE)

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

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

答案 1 :(得分:3)

这可能是您可能使用的替代方案:

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子句,因此返回所有 table 记录)。我不知道Postgresql是否在那里进行了一些查询优化。