【发布时间】:2018-06-25 16:34:50
【问题描述】:
我的数据库中有一个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字段并不总是以“版本”为前缀。有时 它是“已弃用”或其他一些东西。 -
name字段并不总是包含十进制版本号。有时它可以单独成为一个词。 -
name字段还可以包含Plugin Name 2和Go2URL等项目。 - 问题项目是“版本 1.10”。到目前为止我尝试过的所有方法都导致这个项目不合适。
解决方法:
我通过添加一个名为canonicalVersion 的新VARCHAR 字段并存储规范版本号来临时解决此问题。因此,1.10.210 变为 0001.0010.0210.0000,因此可以简单地使用 ORDER BY canonicalVersion ASC 进行排序,并且所有项目现在都按正确的顺序排列。
虽然我现在已经解决了这个问题,但我仍然希望在不添加额外字段的情况下看到原始问题的解决方案。
【问题讨论】:
-
声明的重复不是这个问题的重复。这具有可变长度前缀,并且版本没有多个级别。
标签: mysql sql sql-order-by