如何为 MySQL 中的字段或列设置别名?
Posted
技术标签:
【中文标题】如何为 MySQL 中的字段或列设置别名?【英文标题】:How to alias a field or column in MySQL? 【发布时间】:2011-08-30 04:48:51 【问题描述】:我正在尝试做这样的事情。但我得到一个未知的列错误:
SELECT SUM(field1 + field2) AS col1, col1 + field3 AS col3 from core
基本上,我只想使用别名,这样我就不需要执行之前执行的操作。这在mysql中可以吗?
【问题讨论】:
错字,应该是 col1 当col1
已经是别名时,为什么你是col1
in select
表中的一个字段,数据类型为整数,field1和field2,别名col1也是整数。
SELECT SUM(field1 + field2 + field3) AS coll from core
有什么问题
@diEcho:我只是想重用之前已经计算过的东西
【参考方案1】:
select @code:= SUM(field1 + field2), @code+1 from abc;
但是,请注意以下内容(来自MySQL 5.6 docs):
作为一般规则,除了在 SET 语句中,您不应该为用户变量赋值并在同一语句中读取该值。例如,要增加一个变量,这是可以的:
SET @a = @a + 1;
对于其他语句,例如 SELECT,您可能会得到预期的结果,但这不能保证。在下面的语句中,你可能会认为 MySQL 会先评估 @a,然后再进行赋值:
SELECT @a, @a:=@a+1, ...;
但是,涉及用户变量的表达式的计算顺序是未定义的。
因此,使用风险自负。
【讨论】:
这是甜蜜的语法糖。 :-) 可悲的是,这在查询中效果很好,但在视图中却不行:( @kenn 在 Mysql 上对我来说工作得很好! @Melvin RTFM dev.mysql.com/doc/refman/5.6/en/user-variables.html “...涉及用户变量的表达式的计算顺序未定义。”事实上,我在上面的查询中得到了 NULL。 @kenn,我添加了警告作为编辑。感谢您的提醒,这可能会咬到不知情的人。【参考方案2】:考虑使用子查询,例如:
SELECT col1
, col1 + field3 AS col3
FROM (
SELECT field1 + field2 as col1
, field3
from core
) as SubQueryAlias
【讨论】:
【参考方案3】:你可以select
别名:
SELECT SUM(field1 + field2) AS col1, (select col1) + field3 AS col3 from core
这行得通。
【讨论】:
它有效。与此相同的问题和相同的解决方案:***.com/questions/2077475/… 这在 mysql 中效果很好。不确定其他数据库。应该是最佳答案 如果您引用的列是根据SELECT MAX(ID) AS c1, (SELECT c1) AS c2 FROM log GROUP BY ID
中的组函数计算的,则此方法不起作用(“引用组函数”错误) - 但是如果您将MAX(ID)
替换为ID
在这个例子中。
@ChristopherK。是正确的。我也遇到了这个。然而,我正在定义一个视图,而不是仅仅运行一个直接的查询。因此,我通过将一个视图嵌套在另一个视图中解决了这个问题。第一个视图使用聚合函数。第二个(包装器视图)在第一个之上执行计算。问题解决了。【参考方案4】:
select @code:= SUM(field1 + field2), (@code*1) from abc;
@code*1 转换成数值表达式,你可以在任何地方使用,比如
select @code:= SUM(field1 + field2), (@code*1)+field3 from abc;
【讨论】:
我来这里是为了给你投票,这在我们的场景中非常有效。用更匈牙利/代码风格友好的变量替换 @code 并保留 AS。@fVariable:=SUM(column) AS alias
(别名应该用反引号括起来,所以不能正确渲染它们。
@ReSpawN 这是未定义的行为。它恰好给了你当时所期望的答案。由于它是开源的,如果您检查代码,某些读 + 写用法对于特定构建(如果您不认为这在术语上是矛盾的)是安全的。【参考方案5】:
根据the spec Ravi Parekh 的回答不能保证始终有效,因为“涉及用户变量的表达式的求值顺序未定义”。
我在尝试使用变量并得到奇怪的结果后找到了this answer。
【讨论】:
【参考方案6】:简短的回答是否定的:
mysql> select 1 as a, a + 1 as b;
ERROR 1054 (42S22): Unknown column 'a' in 'field list'
postgresql# select 1 as a, a + 1 as b;
ERROR: column "a" does not exist
也就是说,一些 SQL 实现允许在 where/group by/having 子句中使用别名,例如:
postgresql# select 1 as a group by a; -- 1 row
【讨论】:
【参考方案7】:如果您将它与聚合函数(分组依据)一起使用,并且如果它不适合您将计算列放在末尾并使用前向列引用。
SELECT FNC2(AF), FNC1(A) AS AF, B, C, FROM Table GROUP BY ...
1st one doesn't work due to forward column referencing. Do this instead
SELECT FNC1(A) AS AF, B, C, FNC2((SELECT AF)) FROM Table GROUP BY ...
【讨论】:
以上是关于如何为 MySQL 中的字段或列设置别名?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Spark SQL 中的posexplode 列提供别名?