日期:2014-05-19  浏览次数:20505 次

自定格式的数据排序和比较问题
一列数据,nvarchar类型,格式如: "xxx-xxx-xxx ",x为数字,但一段xxx的数字位数不固定,排序规则为先比较第一段xxx的数字大小,再比较第二段xxx的大小,最后再比较第三段xxx的大小,有什么好方法来实现吗?

------解决方案--------------------


select *
from
(
select '1000-111-22 ' as ID
union all select '11-22-33 '
union all select '11-202-33 '
)A
order by cast(substring(ID,1,charindex( '- ',ID,1)-1) as int) ,
cast(substring(ID,charindex( '- ',ID,1)+1 ,
charindex( '- ',ID,charindex( '- ',ID,1)+1)-2
-charindex( '- ',ID,1)+1
)as int),
cast( substring(ID,charindex( '- ',ID,charindex( '- ',ID,1)+1)+1,Len(ID)) as int)

------解决方案--------------------
select
[Field],
a=cast(left([Field],charindex( '- ',[Field])-1) as int),
b=cast(substring([Field],charindex( '- ',[Field])+1,len([Field])-charindex( '- ',reverse([Field]))-charindex( '- ',[Field])) as int),
c=right(Field,charindex( '- ',reverse([Field]))-1)
from [Table] order by 2,3,4