MySQL-首先按字母顺序对字段排序,然后再按十进制排序

时间:2018-06-25 16:34:50

标签: mysql sql sql-order-by

我的数据库中有一个VARCHAR name字段,其中包含字符和小数,以表示软件的版本号。 给出以下示例数据,如何按正确的顺序对结果进行排序?

name
--------------------
Version 1.7
Version 1.8
Version 1.9
Version 1.10
Version 2.2
Version 3.0
Version 3.3

默认情况下,问题是仅按name对结果进行排序会导致如下所示:

name
--------------------
Version 1.10
Version 1.7
Version 1.8
Version 1.9
Version 2.2
Version 3.0
Version 3.3

这是在StackOverflow上问过的,我已经通过并测试了提供的许多答案,但是没有运气。很难找到适用于类似结果集(即字母数字和十进制的混合)的解决方案。

我已经尝试过:

ORDER BY CAST(name AS INTEGER)
ORDER BY CAST(name AS DECIMAL)
ORDER BY CAST(name AS DECIMAL(4,2)
- same as above but CONVERT(name, [type])
ORDER BY ABS(name)
- some other things which have since slipped my mind :/

注意事项:

  • name字段并非始终以'Version'为前缀。有时 是“已弃用”或其他一些东西。
  • name字段并不总是包含十进制版本号。有时它可以是一个词。
  • name字段也可以包含Plugin Name 2Go2URL之类的项目。
  • 问题项目为“版本1.10”。到目前为止,我尝试过的所有方法都导致该项目不合时宜。

解决方法:

我通过添加名为VARCHAR的新canonicalVersion字段并存储规范的版本号来临时解决此问题。因此,1.10.210变为0001.0010.0210.0000,因此可以简单地与ORDER BY canonicalVersion ASC进行排序,并且所有项目现在都以正确的顺序排列。

尽管我现在已经解决了这个问题,但我仍然希望在不添加额外字段的情况下看到原始问题的解决方案。

1 个答案:

答案 0 :(得分:0)

我认为您可以使用substring_index()和一些操作:

order by left(name, length(name) - length(substring_index(name, ' ', -1)) - 1),
         substring_index(name, ' ', -1) + 0

这假定版本号本身可以转换为数字。