一列的多个别名

时间:2014-05-10 16:14:16

标签: mysql

我知道我可以为列分配临时别名。例如:

select foo, length(foo) as bar from my_table

我知道我可以使用这些别名来获取它们的值:

select foo, length(foo) as bar from my_table order by bar asc

但有时候我想让查询结果更具可读性,当别名中有空格时,我不能在查询的其余部分使用它的值:

select foo, length(foo) as "Foo's length" from my_table order by ? asc

有没有办法为查询定义一个别名和一个别名,这将在结果中看到?

3 个答案:

答案 0 :(得分:1)

为什么这不起作用:

select foo, length(foo) as `Foo's length`
from my_table
order by `Foo's length` asc;

或者,使用带有列引用的旧式order by

select foo, length(foo) as `Foo's length`
from my_table
order by 2 asc;

或者,重复表达式:

select foo, length(foo) as `Foo's length`
from my_table
order by length(foo) asc;

答案 1 :(得分:1)

使用此

select foo, length(foo) as "Foo's length" from my_table order by 2 asc

order by 2 2中是列索引

答案 2 :(得分:1)

它不起作用的原因是MySQL对于双引号意味着什么有点精神分裂。有时它表示字符串文字,有时它表示列别名。

当您编写查询时;

select foo, length(foo) as "Foo's length" 
from my_table order by "Foo's length" asc

...它实际上会创建一个名为Foo's length的列别名,但是按排序字符串文字 Foo's length。由于字符串文字对于所有行都是相同的,因此排序将是伪随机的。

你需要做的就是用反引号一致引用你的别名,事情会很好用;

select foo, length(foo) as `Foo's length` 
from my_table order by `Foo's length` asc

An SQLfiddle showing the difference