我有一个如下所示的数据集:
+--------+
| 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)
你需要重组你的表,否则你可能会有这样的低效查询,
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)