例如使用 SQL 我可以这样做:
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
有没有办法使用 Postgres 做到这一点?
例如使用 SQL 我可以这样做:
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
有没有办法使用 Postgres 做到这一点?
你不能这样做。在 PostgreSQL 和标准 SQL 中都没有。手册:
输出列的名称可用于在
ORDER BY
andGROUP BY
子句中引用列的值,但不能在WHERE
orHAVING
子句中;在那里你必须写出表达式。
可以就这方面的标准进行辩论。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 对于更复杂的操作或如果您想在多个(子)查询中重用中间结果特别有用。
这可能是您可能使用的替代方法:
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 是否在那里做了一些查询优化。