瓦尔查尔范围的顺序子句



>我目前在 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 bycluase 具有 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

最新更新