在 MYSQL 查询中对 alphanum 列进行排序?

Sort an alphanum column in MYSQL query?

提问人:TheoB 提问时间:11/17/2023 最后编辑:Jonas MetzlerTheoB 更新时间:11/18/2023 访问量:58

问:

我想按以下顺序显示我的表格行,并按以下顺序排列:

50ACT-1
50ACT-1A1
50ACT-1A5
50ACT-1A10
50ACT-2

除了目前,在我的查询中,我的行按以下顺序显示:

50ACT-1
50ACT-1A1
50ACT-1A10
50ACT-1A5
50ACT-2

论坛上有几篇关于这个主题的帖子,但我还没有找到我的答案...... 你对我可以把什么放在订单中有什么想法吗? 提前致谢

SQL 的MySQL

评论

1赞 Jonas Metzler 11/17/2023
此列中可以提供哪些数据?我假设你只是展示了你桌子的一小部分。需要承保哪些情况?
1赞 Jonas Metzler 11/17/2023
对于您给定的示例数据,类似的东西就可以了,但我怀疑这是否会涵盖所有可能的情况。ORDER BY LEFT(col,7), LENGTH(col), col
0赞 TheoB 11/17/2023
感谢您的帮助!您的订单解决了所有问题!有好的一天!
0赞 user1191247 11/17/2023
@TheoB 请注意,请求提供有关可能值的更多详细信息。使用建议的顺序,将介于 和 之间。50ACT-1B250ACT-1A550ACT-1A10
1赞 jarlh 11/17/2023
值是否相似和可能?6ACT-123B12100ACT-15A8

答:

0赞 Ajax1234 11/18/2023 #1

一个彻底的排序过程可以利用regexp_substr来找到每个字符串的两个目标数字分量,然后它们可以作为子句中的整数:castorder by

select t.s from tbl t order by 
   cast(regexp_substr(t.s, '^\d+') as float), -- first, by leading number
   cast(regexp_substr(t.s, '(?<=\-)\d+') as float), -- then, by number just after the dash
   cast(regexp_substr(t.s, '\d+$') as float) -- lastly, by trailing number (if it exists)

看小提琴