>我目前在 db 中有一列,其中很少有范围存储为 varchar,例如:
0-499
1000-1199
500-999
如何对这些范围进行排序,如下所示:
0-499
500-999
1000-1199
提前致谢
如果你想变得棘手,你可以做:
order by cast(replace(col, '-', '.') as decimal(30, 15))
这会将连字符替换为小数点,转换为数值,并将其用于排序。 这应该适用于几乎任何数据库。
这并不完美,因为它并没有真正按范围的第二个数字正确排序。 但是第一个数字需要完全匹配(出于某种原因,根据您的样本数据,这对我来说似乎不太可能(。
按连字符前的字符排序,转换为整数。
您可以将order by
子句与left()
函数一起使用:
order by cast(left(n, charindex('-', n)-1) as int);
但是,前面的order by
cluase 具有 int 对话,如果您在连字符之前有十进制值,则改用decimal
如果这些是唯一的值:
order by
case varcharcol when '0-100' then 1
when '500-1000' then 2
when '1000-1199' then 3
end
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