20

我对排序/排序有问题,不能像我需要的那样工作。

SELECT `proc` FROM `table` ORDER BY `proc` DESC;

结果:

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

我需要的是:

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

怎么做 ?

4

4 回答 4

50

看起来“proc”是一个字符串(varchar字段),所以它是按词法排序的。如果是这样,您可能可以通过以下方式订购

SELECT `proc` FROM `table` ORDER BY convert(`proc`, decimal) DESC;

请注意,这样的查询会非常慢,对于任何严重的使用,最好使用数字列来存储数字数据。

于 2012-07-30T20:02:55.673 回答
8

proc 的列字段是一个 VARCHAR 或 CHAR 并且它把它当作一个文字字符串——按字母顺序排序。

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

SELECT `proc` FROM `table` ORDER BY CAST(`proc` AS decimal) DESC;
于 2012-07-30T20:01:32.050 回答
1

你的桌子设计有一些根本性的问题。而不是使用列'80.0 proc'中的值VARCHAR,您应该只保留80.0一列类型REAL(或任何适合您的数据的合适的数字类型)。您可以进行动态转换,仅在ORDER BY表达式中使用,但这也可能会降低查询的性能。

在此处将“ proc ”添加到您的文本中似乎没有用,它还会阻止您进行简单的转换。

令人惊讶的是(见che的回答),显然,convert(..., decimal)能够忽略尾随的垃圾。不过,这不是您通常应该依赖的东西。

关于转换这方面的文档不是特别清楚。值得阅读该部分以了解字符串/数字的限制(通常会发生),例如:

mysql> SELECT '18015376320243459' = 18015376320243459;
        -> 0

如果这种行为发生了变化,您可能可以replace()在这种情况下使用,只是为了摆脱' proc'.

对于更复杂的事情,您可能会使用正则表达式替换从字符串中提取数值并在排序之前将其转换为数字,但这在 MySQL 中不支持开箱即用,无论如何这将相当笨重(修复问题的根源:您的列数据类型)。

要处理您的遗留数据,您可以添加一个额外的列并使用外部程序(使用任何能够进行正则表达式替换的语言),这应该不会太难。

于 2012-07-30T20:11:08.950 回答
1

如果你总是有相同的小数点数,我的方法是:

SELECT `proc` FROM `table` ORDER BY LENGTH(proc) DESC, proc DESC;
于 2019-12-03T08:57:50.980 回答