Как сортировать числа с текстом численно в sql?

#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 не может поддерживать ваш код. Есть какой-либо метод, который можно заменить?