2011-08-19 50 views
7

我想要做这样的事情:如果我在SELECT子句中使用别名,我该如何引用该别名?

SELECT round(100*(col_a - col_b)/col_a, 1) as Foo, Foo - col_c as Bar 
FROM my_table 
WHERE...; 

不过,我得到一个错误说Foo是未知的。由于Foo是从其他一些列上的一些计算中推导出来的,所以我不想再次重复公式Bar。任何解决方法?

+0

你用什么db? – beny23

+0

我正在使用Vertica,但我也遇到了与MySQL相同的错误。 –

回答

8
SELECT Foo, Foo - col_c as Bar 
from (
SELECT round(100*(col_a - col_b)/col_a, 1) as Foo, col_c 
FROM my_table 
WHERE... 

) t; 
+2

+1:和Hallainzil的回答一样,但没有错误:) – MatBailie

3

我通常会用一个子查询处理这个问题:

SELECT Foo, Foo - col_c as Bar 
FROM (
    SELECT round(100*(col_a - col_b)/col_a, 1) as Foo, col_c 
    FROM my_table 
    WHERE ... 
) 
WHERE ... 

如果你有SQL Server中,CTE达到同样的事情。

+0

子查询出现同样的问题。你可能的意思是将“Foo - col_c as Bar”移动到外部查询中。不过,我不确定在这种情况下子查询是否是最优的。 –

+0

正确。 @codie:看到这个类似的问题的解释:http://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause/6545685#6545685 –

+0

@codie:你要么使用子查询解决方案或者在'WHERE'子句中重复代码。 –

相关问题