0

我正在尝试编写一个 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]

有什么想法吗?

4

3 回答 3

0

尝试这个:

从 sample_data order by (concat(space(10-length(product_code)),product_code)) asc 中选择 product_code

重要的部分是(连续...

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

于 2013-05-15T14:52:28.130 回答
0

按照您描述结果的方式,以下将起作用:

order by length(product_code), product_code;

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

order by (product_code like REGEXP '^[0-9]*') desc
         length(product_code),
         product_code
于 2013-05-15T14:22:57.050 回答
0

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

ORDER BY CHAR_LENGTH(product_code), product_code

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

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

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

于 2013-05-15T14:27:14.740 回答