我的数据库中有一个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
之类的项目。解决方法:
我通过添加名为VARCHAR
的新canonicalVersion
字段并存储规范的版本号来临时解决此问题。因此,1.10.210
变为0001.0010.0210.0000
,因此可以简单地与ORDER BY canonicalVersion ASC
进行排序,并且所有项目现在都以正确的顺序排列。
尽管我现在已经解决了这个问题,但我仍然希望在不添加额外字段的情况下看到原始问题的解决方案。
答案 0 :(得分:0)
我认为您可以使用substring_index()
和一些操作:
order by left(name, length(name) - length(substring_index(name, ' ', -1)) - 1),
substring_index(name, ' ', -1) + 0
这假定版本号本身可以转换为数字。