2015-04-01 4 views
-2

Как сортировать строку с разделителями символов переменной длины?Сортировка символьной разделительной строки переменной длины

Я хотел бы отсортировать эту таблицу

number | make 
=========|========= 
11280-08 | bmw 
13920-08 | audi 
44630-08 | audi 
1741-08 | mercedes 
03-05 | audi 
40093-08 | audi 
332-04 | bmw 

так, что первый восходить суффиксы -00, а затем префиксы 0000 внутри каждый суффикс группы:

number | make 
=========|========= 
332-04 | bmw 
03-05 | audi 
1741-08 | mercedes 
11280-08 | bmw 
13920-08 | audi 
40093-08 | audi 
44630-08 | audi 

Я бег этого запроса

select * from mytable 
order by right(number,2),number asc 

но я получаю это

number | make 
=========|========= 
332-04 | bmw 
03-05 | audi 
11280-08 | bmw 
13920-08 | audi 
1741-08 | mercedes 
40093-08 | audi 
44630-08 | audi 

Обратите внимание, как 1741-08 следует 13920-08 в то время как оно должно предшествовать ему.

+0

Почему вы объединили несколько отдельных значений в одно поле? –

+0

Вы имеете в виду, почему бы не хранить префиксы и суффиксы отдельно? Я не знаю. Я не проектировал эту таблицу. –

ответ

1

Varchars сортирует в алфавитном порядке: (1,11,2,21,3,...) Если вы хотите, чтобы числовой порядок, приведите префикс как целое число.

select * from mytable 
order by 
    right(number,2) 
,CAST(LEFT(number,LEN(number)-3) AS int) 
+0

Ты прибил его мне, Анон. Большое спасибо. Моя ошибка была, как вы указали, ожидая, что varchars будут сортироваться как ints. –

-3

REPLICATE (»», Х - Лен (поле))

, где Х является желательной фиксированной длиной

еще лучше преобразовать - в. и сделать его десятичным числом.

0

Добавить отсутствующий ноль для более короткого номера, чтобы они были первыми. Таким образом, при сортировке все они имеют одинаковую длину. Здесь мы принимаем наибольшее число из 8 символов

select * 
from mytable 
order by REPLICATE('0', 8 - LEN(number)) + number 
Смежные вопросы