пункт заказа для диапазонов varchar - PullRequest
0 голосов
/ 04 июня 2018

В настоящее время у меня есть столбец в дБ с несколькими диапазонами, хранящимися как varchar, например:

0-499
1000-1199
500-999

Как мне упорядочить эти диапазоны следующим образом:

0-499
500-999
1000-1199

Спасибо зазаранее

Ответы [ 5 ]

0 голосов
/ 04 июня 2018
create table #temp1(id int,range varchar(50))

insert into #temp1(id,range)
values (1,'0-499'),(2,'1000-1199'),(3,'500-999')

select * from #temp1 order by cast(replace(range, '-', '.') as decimal(30, 15))


id  range
1   0-499
3   500-999
2   1000-1199

select * from #temp1 order by cast (substring(range,0,charindex('-',range)) as int)

id  range
1   0-499
3   500-999
2   1000-1199
0 голосов
/ 04 июня 2018

, если это единственные значения:

order by 
case varcharcol when '0-100' then 1
when '500-1000' then 2
when '1000-1199' then 3
end
0 голосов
/ 04 июня 2018

Вы можете использовать предложение order by с функцией left():

order by cast(left(n, charindex('-', n)-1) as int); 

Однако предыдущий order by cluase имеет int беседу, если у вас есть десятичное значение перед дефисом, тогда используйте decimal вместо

0 голосов
/ 04 июня 2018

Если вы хотите быть хитрым, вы можете сделать:

order by cast(replace(col, '-', '.') as decimal(30, 15))

Это заменит дефис десятичной точкой, преобразует в числовое значение и использует его для сортировки.Это должно работать почти в любой базе данных.

Это не идеально, потому что на самом деле он не упорядочен по второму номеру диапазона правильно.Но первое число должно точно совпадать (и по какой-то причине это кажется мне маловероятным исходя из ваших выборочных данных).

0 голосов
/ 04 июня 2018

Порядок по символам перед дефисом, преобразованный в целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...