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

Yur*_*hov 5 sql postgresql

例如,使用SQL我可以做:

SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
Run Code Online (Sandbox Code Playgroud)

使用Postgres有什么办法吗?

Erw*_*ter 8

你不能这样做.在PostgreSQL和标准SQL中都没有.我在这里引用手册:

输出列的名称可用于引用列的值in ORDER BYGROUP BY子句,但不能用于WHEREHAVING子句; 那里你必须写出表达式.

人们可以就这方面的标准进行辩论.休达文实际上在我最近提到的这篇文章中做了很多.

您可以使用像Federico建议的子查询,或像这样的公用表表达式(CTE):

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

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

  • @YuriBarbashov:有很多东西在MySQL中"很好" - 直到它们没有.:) (7认同)

Fed*_*ina 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
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,postgresql 会意识到 `foo.c &lt; 5` 实际上是 `(table.a+table.b) &lt; 5`。如果您将其设置为测试并在“(a+b)”上创建索引,您将看到“(a+b)&lt;5”显示为“索引条件” (3认同)