2011-08-19 11 views
7

voglio fare qualcosa di simile:Se si utilizza un alias in una clausola SELECT, come faccio a rimandare a quell'alias?

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

Tuttavia, ottengo un errore che dice Foo è sconosciuto. Dal momento che Foo è derivato da alcuni calcoli su un gruppo di altre colonne, non voglio ripetere la formula di nuovo per Bar. Qualche soluzione?

+0

che db stai usando? – beny23

+0

Sto usando Vertica, ma ottengo lo stesso errore anche con MySQL. –

risposta

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: come la risposta di Hallainzil, ma senza l'errore :) – MatBailie

3

Io di solito gestire questa situazione con un sub-query:

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

Se hai SQL Server, un CTE raggiunge più o meno la stessa cosa.

+0

Lo stesso problema si presenta con la sottoquery. Quello che probabilmente intendevi era spostare il bit "Foo - col_c as Bar" nella query esterna. Non sono sicuro che una subquery sarà ottimale in questo contesto, però. –

+0

corretto. @codie: vedi questa domanda simile per una spiegazione: http://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause/6545685#6545685 –

+0

@codie: o usi la soluzione di subquery o si ripete il codice nella clausola 'WHERE'. –

Problemi correlati