Это довольно сложно для меня, однако я могу получить желаемый результат с помощью этого запроса.Может не быть решением, но, надеюсь, вы получите идеи из него.
Мой подход заключается в следующем:
- Извлечение чисел из значения
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;