MySQL - 先按字母顺序排列字段,然后按小数点排列

标签 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”。到目前为止,我尝试过的所有方法都导致此项目不合适。

解决方法:

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

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

最佳答案

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

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

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

关于MySQL - 先按字母顺序排列字段,然后按小数点排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51028112/

相关文章:

php - 如何在laravel 5.1中访问子函数内父函数的参数

java - 连接到数据库的方法给出空指针异常

php mysql 查询 fatal error

mysql - SQL - HAVING 子句中的多行

c# - 使用 asp.net usercontrols 按属性值对列表进行排序

php - MySQL 选择分组依据和排序依据

mysql - MySQL 查询中的每一行都需要一个序列号

php - 从 MySQL 表中获取值,只显示前十名最高和前十名最低

c# - 使用数据库信息填充组合框

sql - 当 select 不返回任何行时,有没有办法使用占位符?