我正在尝试编写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]
有什么想法吗?
答案 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个字符,并在左侧填充空格。