【问题标题】:If I use an alias in a SELECT clause, how do I refer back to that alias?如果我在 SELECT 子句中使用别名,我如何引用该别名?
【发布时间】:2011-08-19 10:35:50
【问题描述】:

我想做这样的事情:

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

但是,我收到一条错误消息,提示 Foo 未知。由于 Foo 是从一堆其他列上的一些计算得出的,我不想为 Bar 再次重复该公式。有什么解决办法吗?

【问题讨论】:

  • 我正在使用 Vertica,但我在使用 MySQL 时也遇到了同样的错误。

标签: sql


【解决方案1】:
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】:

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

    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 可以实现大致相同的目标。

    【讨论】:

    • 子查询也会出现同样的问题。您可能的意思是将“Foo - col_c as Bar”位移动到外部查询。不过,我不确定子查询在这种情况下是否是最佳的。
    • 正确。 @codie:请参阅此类似问题以获得解释:stackoverflow.com/questions/6545664/…
    • @codie:您要么使用子查询解决方案,要么重复WHERE 子句中的代码。
    • @codie - 请记住,在这种情况下,子查询是内联视图。它在编译时被扩展,并且 应该 执行与您没有使用此“技巧”相同以避免在代码中重复自己(通过使用外部 WHERE 子句中的别名定义或使用它们来实现Foo - col_c).
    • 啊,抱歉,错误源于没有正确阅读您的问题。然而,原则保持不变,三氯生的答案给了你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多