7

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

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

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

4

2 回答 2

10

你不能这样做。在 PostgreSQL 和标准 SQL 中都没有。手册:

输出列的名称可用于在 ORDER BYandGROUP BY子句中引用列的值,但不能在WHEREorHAVING子句中;在那里你必须写出表达式。

可以就这方面的标准进行辩论。Hugh Darwen 在我最近提到的这篇文章中竭尽全力做到了这一点。

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

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

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

于 2012-06-27T02:07:11.813 回答
4

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

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 是否在那里做了一些查询优化。

于 2012-06-27T01:54:15.270 回答