我有一个 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
所有的东西都按正确的顺序排列。
虽然我已经解决了这个问题,但我仍然希望看到一个解决方案来解决原来的问题,而不添加额外的字段。
1条答案
按热度按时间o4tp2gmn1#
我想你可以用
substring_index()
还有一些操作:这假设版本号本身可以转换为数字。