首页 > 解决方案 > 如何对包含数字和字母的字符串进行排序?

问题描述

我有 qt_no 值,例如

AM1,M3,M4,M14,M30,M40,MA01,A10,A13,A07,B01,B10,Z33,Z13

等(实际上是字母后的任何 int 2-3 位数字)。

我试过排序为

order by length(qt_no), qt_no

它没有达到我要求的输出。

我的预期输出是

A01,A07,A10,A13,B01,AM1,M3,M4,M14,M30,M40,MA01,Z13,Z33

请记住,这些 qt_no 值属于同一个字段和同一个表的不同行。

我不知道从这里开始该怎么做。

任何帮助将不胜感激。

编辑

这是一个可以使用的示例数据库。

标签: mysqlsortingmysql-5.7

解决方案


最好的方案是创建两列额外的列,一列用于字母部分,一列用于数字部分;那么它就像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;

推荐阅读