【问题标题】:MySQL - Order field alphabetically first and then decimallyMySQL - 首先按字母顺序排列字段,然后按小数顺序排列
【发布时间】: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 2Go2URL 等项目。
  • 问题项目是“版本 1.10”。到目前为止我尝试过的所有方法都导致这个项目不合适。

解决方法:

我通过添加一个名为canonicalVersion 的新VARCHAR 字段并存储规范版本号来临时解决此问题。因此,1.10.210 变为 0001.0010.0210.0000,因此可以简单地使用 ORDER BY canonicalVersion ASC 进行排序,并且所有项目现在都按正确的顺序排列。

虽然我现在已经解决了这个问题,但我仍然希望在不添加额外字段的情况下看到原始问题的解决方案。

【问题讨论】:

  • 声明的重复不是这个问题的重复。这具有可变长度前缀,并且版本没有多个级别。

标签: mysql sql sql-order-by


【解决方案1】:

我认为你可以使用substring_index() 和一些操作:

order by left(name, length(name) - length(substring_index(name, ' ', -1)) - 1),
         substring_index(name, ' ', -1) + 0

这假设版本号本身可以转换为数字。

【讨论】:

  • 感谢您抽出宝贵时间查看并回答我的问题。我刚刚尝试了导致以下错误的解决方案:'...检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 ') + 0' 附近使用正确的语法。我从最后一个 order by 子句的末尾删除了尾随 ) ,它可以正常工作,但结果的顺序仍然不正确,1.10 首先出现。
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2022-01-01
  • 2013-06-29
  • 1970-01-01
  • 2021-12-28
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多