我想知道为什么这不起作用(在PostgreSQL中):
create table t(c integer);
insert into t values(1);
insert into t values(2);
insert into t values(3);
select c+10 as result from t group by result order by result;
--> OK
select c+10 as result from t where result > 10;
--> ERROR: column "result" does not exist
所以我可以按顺序引用列结果,按顺序引用,但不是在哪里。那是为什么?
这只是一个简化的例子。实际上,选择部分中有一个功能。我需要在where-part中使用该函数的结果。我不想两次计算这个函数。最好的方法是什么(如上例所示,如何避免两次计算c + 10)?
答案 0 :(得分:2)
您可以使用LATERAL
:
SELECT result
FROM t
,LATERAL (SELECT c+10) AS s(result) -- here you calculate what you need
WHERE result > 10;
然后你可以参考SELECT/WHERE/ORDER BY...
子句中的计算值。
的 SqlFiddleDemo
强>
简化执行顺序:
如您所见WHERE
在SELECT
之前,这就是您无法在WHERE
中引用计算表达式的原因。
答案 1 :(得分:1)
您无法在定义它的级别上引用列别名。您需要将其包装在派生表中:
select *
from (
select c+10 as result
from t
) x
where result > 10;
对此没有性能影响,它仅仅是语法糖