【问题标题】:Using an Alias in SQL Calculations在 SQL 计算中使用别名
【发布时间】:2010-01-16 13:38:29
【问题描述】:

为什么这个查询不起作用?

SELECT 10 AS my_num, my_num*5 AS another_number
FROM table

在此示例中,我尝试在其他计算中使用 my_num 别名。这会导致未知列“my_num”

这是我正在尝试做的简化版本,但基本上我想使用别名来进行其他计算。我的计算要复杂得多,这就是为什么给它起别名会很好,因为我以不同的方式重复了几次。

【问题讨论】:

    标签: mysql sql database syntax


    【解决方案1】:

    只需用 (SELECT alias) 包装您重复使用的别名:

    SELECT 10 AS my_num, 
           (SELECT my_num) * 5 AS another_number
    FROM table
    

    【讨论】:

    • 我想知道该功能在哪里记录。我搜索了整个 MySQL 文档,但没有找到。我不知道这种“别名重用”是如何工作的,我对可移植性或性能影响感到好奇。如果有人对此有更多了解,我将不胜感激。谢谢你。
    • 这只是我的一周..也许是一个月。超级有用,特别是对于由流控制语句(如IF()CASE() 等)构建的别名
    • @CarlosGant:(SELECT alias) 部分被视为“依赖子查询”,至少根据 MySQL 的 EXPLAIN 和 Visual Explain 函数。
    • 没关系,它对我不起作用。我得到了“未知列”。
    • SELECT kabupaten.nama AS kabupaten, kecamatan.nama AS kecamatan, SUM(pihaks.luas) AS target_luas, SUM(realisasi.luas) AS realisasi_luas, SELECT(realisasi_luas)/SELECT(target_luas)*100 AS persentase_luas。像这样尝试但不起作用
    【解决方案2】:

    您需要使用子选择来以这种方式使用别名

    SELECT my_num*5 AS another_number FROM
    (
        SELECT 10 AS my_num FROM table
    ) x
    

    【讨论】:

    • @RyanHeneise,它是一个子选择别名;这样你就可以选择x.my_num
    【解决方案3】:

    sql 中的别名与编程语言中的变量不同。别名只能在某些点被再次引用(特别是在GROUP BYHAVING 子句中)。但是您不能在 SELECT 子句中重用别名。因此,您可以使用派生查询(例如 Rubens Farias 建议的),它可以让您基本上重命名列和/或命名任何计算列。

    如果您的公式通常是固定的,您也可以使用VIEW

    CREATE VIEW table10 AS SELECT 10 AS my_num FROM table;
    SELECT my_num * 5 AS another_number FROM table10;
    

    我相信这会比使用派生查询稍快,但它可能很大程度上取决于您的实际查询。

    或者你可以只是复制工作:

    SELECT 10 AS my_num, 10 * 5 AS another_number FROM table;
    

    这在 php/perl 之类的东西中可能很方便:

    my $my_num = 10;
    my $query = "SELECT $my_num AS my_num, $my_num * 5 AS another_number FROM table";
    

    【讨论】:

      【解决方案4】:

      ``另一种选择是使用 APPLY 运算符

      SELECT my_num, my_num*5 AS another_number
      FROM table
      CROSS APPLY 
      (SELECT 5 AS my_num) X
      

      【讨论】:

      • 请注意,CROSS APPLY 在 MySQL 中似乎不可用(还)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 2021-06-21
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多