2011-08-19 20 views
7

quiero hacer algo como esto:Si uso un alias en una cláusula SELECT, ¿cómo me refiero a ese alias?

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

Sin embargo, me sale un error que dice Foo es desconocido. Como Foo se deriva de algunos cálculos en otras muchas columnas, no quiero repetir la fórmula nuevamente para Bar. ¿Alguna solución temporal?

+0

¿qué db estás utilizando? – beny23

+0

Estoy usando Vertica, pero también consigo el mismo error con MySQL. –

Respuesta

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: Igual que la respuesta de Hallainzil, pero sin el error :) – MatBailie

3

Por lo general se manejar esto con una sub-consulta:

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

Si usted tiene SQL Server, un CTE logra lo mismo.

+0

El mismo problema surge con la subconsulta. Lo que probablemente quiso decir fue mover el bit "Foo - col_c como Bar" a la consulta externa. Sin embargo, no estoy seguro si una subconsulta será óptima en este contexto. –

+0

Correcto. @codie: consulta esta pregunta similar para obtener una explicación: http://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause/6545685#6545685 –

+0

@codie: o utilizas la solución de subconsulta o repites el código en la cláusula 'WHERE'. –