У меня есть таблица с идентификатором (varchar) как
-----------------------------------------
ID |NAME |COLUMN1 |COLUMN2 |
-----------------------------------------
11.10 |abcd |New col | new col |
11.10(a) |abcd |New col | New Col 2|
11.50 |abcd |New COl | New coli |
11.50(a1) |abcd |New col | New Col 2|
11.50(a2) |abcd |New col | New Col 2|
11.300(a) |abcd |New col | New Col 2|
11.200(a) |abcd |New col | New Col 2|
11.100(a) |abcd |New col | New Col 2|
11.40(a) |abcd |New col | New Col 2|
Теперь, если я получаю отсортированные данные, используя:
Select * from table order by length(id) asc,id;
Я получаю результат, как
11.10
11.50
11.10(a)
11.100(a)
11.200(a)
11.300(a)
11.40(a)
11.50(a)
11.50(a1)
Но я хочу, чтобы
11.10
11.10(a)
11.40(a)
11.50
11.50(a)
11.50(a2)
11.200(a)
11.300(a)
Каким будет подходящий запрос для этого же? Я попытался использовать CAST, но я получаю желаемый результат.
Возможно, ваш желаемый запрос:
select ID
from Table_
order by cast( SUBSTRING_INDEX(SUBSTRING_INDEX(id, '.',-1), '(', 1) as signed ),
SUBSTRING_INDEX(SUBSTRING_INDEX(id, '(',-1), ')', 1);
Для вашего примера вы можете просто использовать length()
:
order by length(id), id
Несколько более общий подход использует substring_index()
и неявное преобразование:
order by substring_index(id, '.', 1) + 0,
substring_index(id, '.', -1) + 0,
id
Select Convert(Id,UNSIGNED INTEGER) AS num, col1, col2, col3 from Table Order By num
Это работает как Oracle To_Number, поэтому я бы посоветовал, что это будет полезно