我可以在包含各种长度字母数字值的VARCHAR字段上实现自然排序吗?

时间:2013-05-15 14:13:18

标签: mysql sql-order-by

我正在尝试编写MySQL查询,这将允许我在包含各种字符串长度和格式化值的VARCHAR产品代码字段上实现自然排序。

我已经尝试了很多搜索Stack Overflow的技术,但是我无法为我的场景工作:

product_code(样本数据)

BA112
BA113
BA27
BA12
112
998
BA113[1]
BA113[2]

应排序:

112
998
BA12
BA27
BA112
BA113
BA113[1]
BA113[2]

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您描述结果的方式如下:

order by length(product_code), product_code;

如果您特别希望数字首先出现并且可以更长,那么:

order by (product_code like REGEXP '^[0-9]*') desc
         length(product_code),
         product_code

答案 1 :(得分:0)

我现在能找到的唯一答案是先按字符串长度排序,然后按字母数字顺序排序:

ORDER BY CHAR_LENGTH(product_code), product_code

但是我认为你的BA27真的像“BA”和“27”,你想先用字母顺序排序,然后是数字,不是吗?

如果是这样,您应该将字母和数字部分存储在不同的字段中。

请记住使用CHAR_LENGTH() MySQL函数,特别是如果您使用UTF编码,因为多字节字符(如“Ñ”或“¿”)。

答案 2 :(得分:0)

试试这个:

选择product_code 来自sample_data order by(concat(space(10-length(product_code)),product_code))asc

重要的部分是顺序(concat ......

使所有值均为10个字符,并在左侧填充空格。