我的数据库中有一个 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”。到目前为止,我尝试过的所有方法都导致此项目不合适。
解决方法:
我通过添加一个名为 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/