2011-08-19 7 views
7

chcę zrobić coś takiego:Jeśli używam aliasu w klauzuli SELECT, w jaki sposób odwołać się do tego aliasu?

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

Jednakże pojawia się błąd mówiący Foo jest nieznany. Ponieważ Foo pochodzi z niektórych obliczeń na kilka innych kolumn, nie chcę powtórzyć formuły ponownie dla Bar. Jakieś obejścia?

+0

jakiego używacie db? – beny23

+0

Używam Vertica, ale otrzymuję ten sam błąd również z MySQL. –

Odpowiedz

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: Tak samo jak odpowiedź Hallainzila, ale bez błędu :) – MatBailie

3

I zazwyczaj obsługiwać to z sub-zapytania:

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 ... 

Jeśli masz SQL Server, CTE osiąga znacznie samo.

+0

Ten sam problem pojawia się w przypadku podkwerendy. Prawdopodobnie chodziło o przesunięcie bitów "Foo - col_c as Bar" do zewnętrznego zapytania. Nie jestem pewien, czy podkwerenda będzie optymalna w tym kontekście. –

+0

Prawidłowo. @ codie: Zobacz podobne pytanie, aby uzyskać wyjaśnienie: http://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause/6545685#6545685 –

+0

@codie: możesz użyć rozwiązania do podkwerendy lub powtórzysz kod w klauzuli "WHERE". –

Powiązane problemy