这对我来说非常棘手,但是我可以通过此查询获得您想要的结果。可能不是解决方案,但希望您能从中获得灵感。
我的方法是:
- 从
res_no 值中提取数字。我正在使用REGEXP_REPLACE 在res_no 中查找任何字母值并替换为空值。所以输出只是(CAST AS UNSIGNED)数字。
CAST(REGEXP_REPLACE(res_no,' *[A-Z] *', '') AS UNSIGNED) AS numbers
- 按数字分配自定义行号值,如 1、A 为 2、B 为 3.. 等等。因此,如果您的
res_no 值跨越到 Z,那么......
CASE WHEN res_no REGEXP ('^[0-9]')=1 THEN 1
WHEN res_no LIKE 'A%' THEN 2
WHEN res_no LIKE 'B%' THEN 3
WHEN res_no LIKE 'C%' THEN 4
WHEN res_no LIKE 'D%' THEN 5
WHEN res_no LIKE 'E%' THEN 6
WHEN res_no LIKE 'F%' THEN 7 END AS rownum
- 最后一部分是先根据 rownum 然后数字进行排序,我添加了最后一个条件
LENGTH(res_no),因为我得到了一些类似 93, 93(2) 的排序。
SELECT res_no,
CAST(REGEXP_REPLACE(res_no,' *[A-Z] *', '') AS UNSIGNED) AS numbers,
CASE WHEN res_no REGEXP ('^[0-9]')=1 THEN 1
WHEN res_no LIKE 'A%' THEN 2
WHEN res_no LIKE 'B%' THEN 3
WHEN res_no LIKE 'C%' THEN 4
WHEN res_no LIKE 'D%' THEN 5
WHEN res_no LIKE 'E%' THEN 6
WHEN res_no LIKE 'F%' THEN 7 END AS rownum
FROM TableA
ORDER BY rownum,numbers,LENGTH(res_no);
上面的查询产生了以下输出:
+----------+---------+--------+
| res_no | numbers | rownum |
+----------+---------+--------+
| 37 | 37 | 1 |
| 39A | 39 | 1 |
| 91G | 91 | 1 |
| 93 | 93 | 1 |
| 93(2) | 93 | 1 |
| 105FF | 105 | 1 |
| 113 | 113 | 1 |
| 114A | 114 | 1 |
| A6 | 6 | 2 |
| A50 | 50 | 2 |
| A51A | 51 | 2 |
| A141 | 141 | 2 |
| A141(25) | 141 | 2 |
| A143B | 143 | 2 |
| B14 | 14 | 3 |
| C40FF | 40 | 4 |
| D153(1) | 153 | 5 |
| D154 | 154 | 5 |
| D154A | 154 | 5 |
+----------+---------+--------+
现在,您进行如下查询,也得到相同的结果:
SELECT res_no
FROM TableA
ORDER BY CASE WHEN res_no REGEXP ('^[0-9]')=1 THEN 1
WHEN res_no LIKE 'A%' THEN 2
WHEN res_no LIKE 'B%' THEN 3
WHEN res_no LIKE 'C%' THEN 4
WHEN res_no LIKE 'D%' THEN 5
WHEN res_no LIKE 'E%' THEN 6
WHEN res_no LIKE 'F%' THEN 7 END,
CAST(REGEXP_REPLACE(res_no,' *[A-Z] *', '') AS UNSIGNED),
LENGTH(res_no);
从SELECT 切换到ORDER BY。
顺便说一句,我正在使用 MariaDB 10.3;