gpt4 book ai didi

MySQL - 先按字母顺序排列字段,然后按小数点排列

转载 作者:行者123 更新时间:2023-11-30 21:42:13 25 4
gpt4 key购买 nike

我的数据库中有一个 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 2Go2URL 等项。
  • 问题项是“版本 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com