如何将varchar字段作为数字排序?

waz*_*123 17 mysql sql

我有排序/订单的问题,而不是像我需要的那样工作.

SELECT `proc` FROM `table` ORDER BY `proc` DESC;
Run Code Online (Sandbox Code Playgroud)

结果:

80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
200.0 proc
20.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc
Run Code Online (Sandbox Code Playgroud)

我需要的是:

200.0 proc
190.0 proc
180.0 proc
170.0 proc
160.0 proc
150.0 proc
140.0 proc
130.0 proc
120.0 proc
110.0 proc
100.0 proc
90.0 proc
80.0 proc
70.0 proc
60.0 proc
50.0 proc
40.0 proc
20.0 proc
Run Code Online (Sandbox Code Playgroud)

怎么做 ?

che*_*che 44

看起来"proc"是一个字符串(varchar字段),所以它是词法排序的.如果是这样,你可以订购它

SELECT `proc` FROM `table` ORDER BY convert(`proc`, decimal) DESC;
Run Code Online (Sandbox Code Playgroud)

请注意,此类查询将非常缓慢,对于任何严重的使用情况,最好使用数字列来存储数字数据.

  • 我不希望这样工作但是[它确实](http://sqlfiddle.com/#!2/e9c9d/4) (3认同)
  • 有意思,会想到将'80 .0 proc'转换为十进制会失败.谁知道为什么? (3认同)

Ray*_*Ray 7

proc的列字段是VARCHAR或CHAR,它将其视为文字字符串 - 按字母顺序排序.

将列转换为double或float或转换值

SELECT `proc` FROM `table` ORDER BY CAST(`proc` AS decimal) DESC;
Run Code Online (Sandbox Code Playgroud)

  • 它显然有效,只需[需要写](http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast)为[`cast(proc as decimal)`]( http://sqlfiddle.com/#!2/e9c9d/8) (3认同)