我正在尝试编写一个 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]
有什么想法吗?
我正在尝试编写一个 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]
有什么想法吗?
尝试这个:
从 sample_data order by (concat(space(10-length(product_code)),product_code)) asc 中选择 product_code
重要的部分是(连续...
使所有值的长度为 10 个字符,并在左侧填充空格。
按照您描述结果的方式,以下将起作用:
order by length(product_code), product_code;
如果您特别希望数字首先出现并且它们可以更长,那么:
order by (product_code like REGEXP '^[0-9]*') desc
length(product_code),
product_code
我现在能找到的唯一答案是先按字符串长度排序,然后按字母数字排序:
ORDER BY CHAR_LENGTH(product_code), product_code
但我认为你的BA27真的很像“BA”和“27”,你想先按字母排序,然后按数字排序,不是吗?
如果是这样,您应该将字母和数字部分存储在不同的字段中。
请记住使用CHAR_LENGTH()
MySQL 函数,特别是如果您使用 UTF 编码,因为多字节字符(如“Ñ”或“¿”)。