mysql-order字段按字母顺序排列,然后按小数点排列

jbose2ul  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(333)

我有一个 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 2 以及 Go2URL .
问题项是“版本1.10”。到目前为止,我尝试过的所有方法都导致这个项目不合适。
解决方法:
我通过添加一个新的 VARCHAR 调用的字段 canonicalVersion 以及存储规范版本号。所以, 1.10.210 变成 0001.0010.0210.0000 因此可以简单地与 ORDER BY canonicalVersion ASC 所有的东西都按正确的顺序排列。
虽然我已经解决了这个问题,但我仍然希望看到一个解决方案来解决原来的问题,而不添加额外的字段。

o4tp2gmn

o4tp2gmn1#

我想你可以用 substring_index() 还有一些操作:

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

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

相关问题