用于排序的varchar到数字转换

Dmi*_*try 28 mysql sql sql-order-by

我有一个查询订购column:

select * from mytable order by column asc — sort table
Run Code Online (Sandbox Code Playgroud)

column type是varchar,所以输出是:

1
10
100
11
12
13
Run Code Online (Sandbox Code Playgroud)

如果我希望它们按数值排序,我应该如何排序,因此输出为:

1
10
11
12
13
100
Run Code Online (Sandbox Code Playgroud)

Pab*_*ruz 47

使用:

order by cast(column as unsigned) asc
Run Code Online (Sandbox Code Playgroud)

  • 谁能解释为什么这个 AS INT 不起作用,但 UNSIGNED 起作用? (2认同)

Vin*_*han 24

如果您只想将其column视为INT:

SELECT * FROM mytable ORDER BY column+0;
1
10
11
12
13
100
Run Code Online (Sandbox Code Playgroud)

或者这个,如果你想治疗columnINTVARCHAR

SELECT * FROM mytable ORDER BY column+0, column; #this will sort the column by VARCHAR first and then sort it by INT

abc
xyz
1
10
11
12
13
100
Run Code Online (Sandbox Code Playgroud)


mma*_*tax 12

这也应该有效:


order by (0 + column) asc

  • 使用强制转换,MySQL 引擎知道您想要转换为整数以进行排序。使用加法,MySQL认为您需要在排序之前执行一些通用计算(与 -1/sqrt(column)*log column^2 相同),而您只需要简单的转换。所以我想第一个选项更快,因为它可以根据您的需要进行精确优化。 (2认同)

小智 8

如果我们只是稍微通过声明修改顺序(在字段顺序中添加"+0"),您可以强制MySQL自然地对字段进行排序.

 > select * from mytable order by column+0 asc;
 column
 1 
 10
 11
 12
 13 
 100
Run Code Online (Sandbox Code Playgroud)