【问题标题】:SQL: Compare Version string (W.X.Y.Z) in MySQLSQL:比较 MySQL 中的版本字符串 (W.X.Y.Z)
【发布时间】:2015-11-13 06:18:52
【问题描述】:

我的问题类似于this one,只是我有 4 个组,而不是 3 个。

有没有办法只在 MySQL 中按 4 组的版本字符串排序?

一些示例版本是:

10.0.0.0
11.0.0.3
12.0.0.125
13.8.6.800

总是只有 4 个组。

【问题讨论】:

  • 你知道每个数字的最大长度吗?
  • 从左到右,最大长度为2、1、2、3

标签: mysql sql


【解决方案1】:

Uri 关于使用 UDF 的评论可能是最好的。但是,如果你不能,这里有一种不同的方法:它利用 *1 和 substring_index function 的隐式转换,“在指定的分隔符出现次数之前从字符串返回子字符串”

SELECT Version
FROM foo
order by 
SUBSTRING_INDEX( `version` , '.', 1 )*1,
SUBSTRING_INDEX(SUBSTRING_INDEX( `version` , '.', 2 ),'.',-1)*1, 
SUBSTRING_INDEX(SUBSTRING_INDEX( `version` , '.', -2 ),'.',1)*1,
SUBSTRING_INDEX( `version` , '.', -1 )*1

SQL Fiddle

此外,. 之间的值可以是任意长度,只要它们是数字数据类型即可。

来源:http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_substring-index 在 cmets 中按名称保留用户,于 2006 年 3 月 22 日晚上 8:02

【讨论】:

    【解决方案2】:

    不幸的是,MySQL 没有拆分字符串功能。但是,您可以为此创建一个user defined function,例如以下文章中所述:

    使用该函数,您可以按如下方式构建查询:

    SELECT * FROM   tbl ORDER BY
    CAST(SPLIT_STR(version, '.', 1) AS INT),
    CAST(SPLIT_STR(version, '.', 2) AS INT),
    CAST(SPLIT_STR(version, '.', 3) AS INT),
    CAST(SPLIT_STR(version, '.', 4) AS INT);
    

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2012-04-29
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多