我没有qt_这样的值
AM1,M3,M4,M14,M30,M40,MA01,A10,A13,A07,B01,B10,Z33,Z13
etc(一个字母后2-3位的整数)。
我试过分类
order by length(qt_no), qt_no
它达不到我要求的产量。
我的预期产出是
A01,A07,A10,A13,B01,AM1,M3,M4,M14,M30,M40,MA01,Z13,Z33
记住,这些qt_没有值是同一个字段和同一个表的不同行。
从现在开始我不知道该怎么办。
任何帮助都将不胜感激。
编辑
这里是play with的示例数据库。
最佳答案
最好的方案是创建两个额外的列,一个用于字母部分,一个用于数字部分;然后它就像ORDER BY alpha_part ASC, num_part ASC
一样简单。如果在这两列上有一个联合索引,它也会非常快。
如果您必须在查询时解析该列,这需要时间—而且还会使索引无用,这会使所有操作都慢得多。但你可以这样做:
...
ORDER BY
REGEXP_REPLACE(qt_no, '\d+', '') ASC,
CAST(REGEXP_REPLACE(qt_no, '\D+', '') AS INTEGER) ASC
编辑:很抱歉,我不知道5.7怎么做,除了这样:
SELECT qt_no FROM t
ORDER BY
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(qt_no, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '') ASC,
CAST(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(qt_no, 'A', ''), 'B', ''), 'C', ''), 'D', ''), 'E', ''), 'F', ''), 'G', ''), 'H', ''), 'I', ''), 'J', ''), 'K', ''), 'L', ''), 'M', ''), 'N', ''), 'O', ''), 'P', ''), 'Q', ''), 'R', ''), 'S', ''), 'T', ''), 'U', ''), 'V', ''), 'W', ''), 'X', ''), 'Y', ''), 'Z', '') AS UNSIGNED) ASC;
关于mysql - 如何对包含数字和字母的字符串进行排序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52968151/