例如使用SQL我可以这样做:
SELECT (a+b) as c FROM table WHERE c < 5 AND (c*c+t) > 100;
使用Postgres有没有办法做到这一点?
答案 0 :(得分:8)
你做不到。在PostgreSQL和标准SQL中都没有。我引用the manual here:
输出列的名称可用于引用列的值
ORDER BY
和GROUP BY
条款,但不在WHERE
或HAVING
条款中; 那里你必须写出表达式。
人们可以就这方面的标准进行辩论。 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是否在那里进行了一些查询优化。