【发布时间】: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
我的问题类似于this one,只是我有 4 个组,而不是 3 个。
有没有办法只在 MySQL 中按 4 组的版本字符串排序?
一些示例版本是:
10.0.0.0
11.0.0.3
12.0.0.125
13.8.6.800
总是只有 4 个组。
【问题讨论】:
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
此外,. 之间的值可以是任意长度,只要它们是数字数据类型即可。
来源:http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_substring-index 在 cmets 中按名称保留用户,于 2006 年 3 月 22 日晚上 8:02
【讨论】:
不幸的是,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);
【讨论】: