例如,使用SQL我可以做:
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
Run Code Online (Sandbox Code Playgroud)
使用Postgres有什么办法吗?
你不能这样做.在PostgreSQL和标准SQL中都没有.我在这里引用手册:
输出列的名称可用于引用列的值in
ORDER BY
和GROUP BY
子句,但不能用于WHERE
或HAVING
子句; 那里你必须写出表达式.
人们可以就这方面的标准进行辩论.休达文实际上在我最近提到的这篇文章中做了很多.
您可以使用像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对于更复杂的操作特别有用,或者如果要在多个(子)查询中重用中间结果.
这可能是您可能使用的替代方案:
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是否在那里做了一些查询优化。