您似乎希望以自然顺序排列一系列分层命名的项目。看起来这些项目的名称采用了这种形式。
token [ .token [. token [ .token ]]]
第一个标记之后的后续标记是可选的。
我想您希望每个标记(如果它是数字的)都作为数字传递。也就是说,例如,您希望1.123 出现在1.2 之后,因为123 在数值上大于2。
你没有说你想用字母标记做什么,例如401.k 和 403.b。我想它们应该在数字之后,但按词汇顺序。
此查询 (http://sqlfiddle.com/#!2/81756/2/0) 将解决五个层级的令牌。
SELECT col
FROM T
ORDER BY
FLOOR(SUBSTRING_INDEX(col,'.',1)),
SUBSTRING_INDEX(col,'.',1),
FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',1)))),
SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',1))),
FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',2)))),
SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',2))),
FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',3)))),
SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',3))),
FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',4)))),
SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',4)))
为什么会这样? FLOOR() 将字符串的最左边部分转换为整数,因此它选择前导整数。如果它在尝试转换的字符串中没有找到任何数字,则返回零。
并且,SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',NNN))) 拾取col 项目在NNNth 点右侧的部分。