如何在MySQL中对A1,A2,A3,B1,B2,B3,...,AA1,AA2,AA3进行排序?

Tra*_*vis 2 mysql sql select

我有一个如下所示的数据集:

+--------+
| Square |
+--------+
| A1     |
| A10    |
| A2     |
| A3     |
| A4     |
| A5     |
| A6     |
| A7     |
| A8     |
| A9     |
| B1     |
| B10    |
| B2     |
| B3     |
| B4     |
| B5     |
| B6     |
| B7     |
| B8     |
| B9     |
Run Code Online (Sandbox Code Playgroud)

...

| AA1    |
| AA10   |
| AA2    |
| AA3    |
| AA4    |
| AA5    |
| AA6    |
| AA7    |
| AA8    |
| AA9    |
+--------+
Run Code Online (Sandbox Code Playgroud)

前缀从A#-Z#开始,然后转到AA#-ZZ#并继续,最多2个字母(即它永远不会超过ZZ).数字后缀可以是任何长度(即A1,A10,A100,A1000等).

我如何对这些进行排序并将结果集如下所示:

+--------+
| Square |
+--------+
| A1     |
| A2     |
| A3     |
| A4     |
| A5     |
| A6     |
| A7     |
| A8     |
| A9     |
| A10    |
| B1     |
| B2     |
| B3     |
| B4     |
| B5     |
| B6     |
| B7     |
| B8     |
| B9     |
| B10    |
Run Code Online (Sandbox Code Playgroud)

...

| AA1    |
| AA2    |
| AA3    |
| AA4    |
| AA5    |
| AA6    |
| AA7    |
| AA8    |
| AA9    |
| AA10   |
+--------+
Run Code Online (Sandbox Code Playgroud)

Joh*_*Woo 6

你需要重组你的表,否则你可能会有这样的低效查询,

SELECT  Square
FROM    Table1
ORDER   BY         
        CASE WHEN Square REGEXP '^[A-Z]{2}'
            THEN 1 
            ELSE 0
        END ASC,
        CASE WHEN Square REGEXP '^[A-Z]{2}'
            THEN LEFT(Square, 2)
            ELSE LEFT(Square, 1)
        END ASC,
        CASE WHEN Square REGEXP '^[A-Z]{2}'
            THEN CAST(RIGHT(Square, LENGTH(Square) - 2) AS SIGNED)
            ELSE CAST(RIGHT(Square, LENGTH(Square) - 1) AS SIGNED)
        END ASC
Run Code Online (Sandbox Code Playgroud)

或者通过使用 IF

SELECT  Square
FROM    Table1
ORDER   BY Square REGEXP '^[A-Z]{2}' ASC,
           IF(Square REGEXP '^[A-Z]{2}', LEFT(Square, 2), LEFT(Square, 1)),
           CAST(IF(Square REGEXP '^[A-Z]{2}', RIGHT(Square, LENGTH(Square) - 2), RIGHT(Square, LENGTH(Square) - 1)) AS SIGNED)
Run Code Online (Sandbox Code Playgroud)