#mysql #sql
#mysql #sql
Вопрос:
Моя таблица имеет буквенно-цифровые значения. Я хотел бы сначала упорядочить их численно, но это не может работать.
Ниже приведен пример таблицы, вызывается имя таблицы method_1
:
id | code_name |
4 200 a
1 100 b
3 100-1 c
9 100-1/1 d
11 100-1/1/1 e
12 100-1/1/10 f
2 100-1/1/11 g
13 100-1/1/3 h
14 100-2 i
20 100-1/2 j
32 100-1/2/1 k
Я использую браузер запросов MYSQL версии 1.2.11, мой SQL-запрос SELECT * FROM method_1 order by code_name
, но он не может правильно отсортировать число. И я также использую этот метод SELECT * FROM method_1 order by length(code_name), code_name
, все еще не могу работать
На самом деле я хочу, чтобы ожидаемый результат был таким, как показано ниже в таблице:
id | code_name |
1 100 b
3 100-1 c
9 100-1/1 d
11 100-1/1/1 e
13 100-1/1/3 h
12 100-1/1/10 f
2 100-1/1/11 g
20 100-1/2 j
32 100-1/2/1 k
14 100-2 i
4 200 a
Используя ответ jarlh
Комментарии:
1. Это будет много работы. Вы должны найти и извлечь каждое число.
2. @jarlh Спасибо за ваш ответ. Но последняя цифра не может быть отсортирована. Порядок станет 1,10,11,12,2,20,29
3. Я обновил 1 картинку по своему вопросу, используя ваш метод
4. Имеет ли каждая часть числового подкода некоторый предел? например, не более 3 цифр для каждой части, т. Е. из 100-1/1/1 для 999-999/999/999 ? Если это так, то просто нормализуйте код, добавив начальные нули, т. Е. 100-1/1/1 => 100-001/001/001, затем отсортируйте значения как обычные строки.
5. Не более 3 цифр.
Ответ №1:
WITH
cte AS (SELECT id,
code_name,
CONCAT('[', REGEXP_REPLACE(SUBSTRING_INDEX(code_name, ' ', 1), '[-/ ]', ','), ']') code,
SUBSTRING_INDEX(code_name, ' ', -1) name
FROM test)
SELECT id,
code_name
FROM cte
ORDER BY code->>"$[0]" 0,
code->>"$[1]" 0,
code->>"$[2]" 0,
code->>"$[3]" 0,
name;
Комментарии:
1. Спасибо за ваш ответ. Но моя версия SQL не может поддерживать ваш код. Есть какой-либо метод, который можно заменить?
2. @PiNetworkCrytocurrency Вы хотите, чтобы мы угадали версию вашего сервера?
3. В моем вопросе упоминается браузер запросов MYSQL версии 1.2.11
4. Это более ранняя версия.
5. @PiNetworkCrytocurrency Браузер запросов MySQL — это клиентское программное обеспечение, а не сервер MySQL. Нас не интересует его версия.
Ответ №2:
SELECT *
FROM (SELECT *
,SUBSTRING(code_name,1,3) AS A1
,SUBSTRING(code_name,4, MAX LEN) AS A2
FROM T ) AS T_Total
ORDER BY T_Total.A1
,T_Total.A2
Комментарии:
1. Спасибо за ваш ответ. Но моя версия SQL не может поддерживать ваш код. Есть какой-либо метод, который можно заменить?