2011-08-19 6 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

どのデータベースを使用していますか? – 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:ハランの答えと同じですが、間違いなしです:) – 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'節でコードを繰り返します。 –

関連する問題