select yourColumn
from yourTable
order by
cast(substring_index(yourColumn,'.',1) as unsigned),
cast(substring_index(substring_index(yourColumn,'.',2),'.',-1) as unsigned),
cast(substring_index(substring_index(yourColumn,'.',3),'.',-1) as unsigned)
;
我使用REGEXP_REPLACE插入前导“0”解决了MariaDB中的问题: ORDER BY REGEXP_REPLACE(kKey,'.(:<:[1-9]):>:]','.0\1'); 我在“.”之后最多有2个数字,所以我在单词边界之间替换所有点,然后用一个数字(:<:[1-9]):>:)并捕获数字。然后将其替换为“.0”+捕获的数字。
6条答案
按热度按时间6fe3ivhb1#
虽然有点笨拙,但只要你的所有条目都是x.x.x的,就可以工作了:
j91ykkif2#
请注意,这是一个hack。因此,它具有一定的局限性。也就是说,很有可能它会很好地满足您的目的。
ohtdti5x3#
它可能会帮助,简单而准确的答案:
toe950274#
这被称为“自然排序”,在MySQL中没有办法执行自然排序:Natural Sort in MySQL
您可以通过使用特殊的排序字段来解决它。具有如下值:
10808 10809 10901 10902 10910(前导零)
PS作为一个奖金-排序整数的工作muuuuch比排序字符串(特别是字符串与一些魔术规则)。特别是如果你创建了排序索引。
siv3szwd5#
没有一个答案很实用(要么是错误的,要么是不实用的)。假设你的带点的varchar列是productId,那么你必须用途:
productId * 1
给出的结果与INET_ATON(productId)
相同,它们都是不完整的。我得到了一个这样的结果,所以要解决这个问题,只需添加
length(productId)
。现在一切都好了
xghobddn6#
有点不同的问题。我有一个列表,看起来如下所示:
我使用REGEXP_REPLACE插入前导“0”解决了MariaDB中的问题:
ORDER BY REGEXP_REPLACE(kKey,'.(:<:[1-9]):>:]','.0\1');
我在“.”之后最多有2个数字,所以我在单词边界之间替换所有点,然后用一个数字(:<:[1-9]):>:)并捕获数字。然后将其替换为“.0”+捕获的数字。