在SQL中引用计算值

时间:2016-05-18 09:15:52

标签: sql postgresql where

我想知道为什么这不起作用(在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)?

2 个答案:

答案 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

简化执行顺序:

enter image description here

图片来自:http://social.technet.microsoft.com/wiki/contents/articles/20724.all-at-once-operations-in-t-sql.aspx

如您所见WHERESELECT之前,这就是您无法在WHERE中引用计算表达式的原因。

答案 1 :(得分:1)

您无法在定义它的级别上引用列别名。您需要将其包装在派生表中:

select *
from (
    select c+10 as result 
    from t 
) x 
where result > 10;

对此没有性能影响,它仅仅是语法糖