sql数字字符串排序 15

SQL排序数据是字符串格式,如下1.11.1.11.1.21.210.110.1.110.1.211.12.13.14.1用SQL语句排序,相排序出来的结果是:1.11.... SQL 排序
数据是字符串格式,如下

1.1
1.1.1
1.1.2
1.2
10.1
10.1.1
10.1.2
11.1
2.1
3.1
4.1

用SQL语句排序,相排序出来的结果是:
1.1
1.1.1
1.1.2
1.2
2.1
3.1
4.1
10.1
10.1.1
10.1.2
11.1
展开
 我来答
鲜美还清湛灬白桦N
推荐于2017-12-15 · TA获得超过621个赞
知道小有建树答主
回答量:404
采纳率:50%
帮助的人:527万
展开全部
--负责把字符串转换为Varbinary
--思路,把字符串按.拆分,然后转换成int,再转换成varbinary拼接
Create Function f_Order(@SourceSql  Varchar(8000),@StrSeprate Varchar(2))   
Returns Varbinary(8000)
As     
  Begin  
Declare @temp  Varbinary(8000)=0x0
Declare   @ch  Varchar(100)   
Set   @SourceSql=@SourceSql+@StrSeprate     
While(@SourceSql<>'')   
Begin   
 Set   @ch=left(@SourceSql,Charindex(@StrSeprate,@SourceSql,1)-1)   
 Set   @temp=@temp+Convert(Varbinary, Convert(Int,@ch))   
 Set   @SourceSql=Stuff(@SourceSql,1,Charindex(@StrSeprate,@SourceSql,1),'')   
  End   
  Return  @temp 
End   
Go

--建表
Create table T
(
A Varchar(100)
)

--插入数据
Insert Into T Values('1.1')
Insert Into T Values('1.1.1')
Insert Into T Values('1.1.2')
Insert Into T Values('1.2')
Insert Into T Values('10.1')
Insert Into T Values('10.1.1')
Insert Into T Values('10.1.2')
Insert Into T Values('11.1')
Insert Into T Values('2.1')
Insert Into T Values('3.1')
Insert Into T Values('4.1')

--测试
Select * from T 
order by dbo.f_Order(A,'.')

 

追问
这种方式,有点复杂。不过也值得学习。
追答
--这用起来是最简单,再给你写种方法?
--先按.拆分字符串,然后不足4位的用0补齐,然后在拼在一起排序
With CT
As
(
Select A,Right('0000'+val,4) As Val From 
(
Select A, CAST( '<v>'+REPLACE(A,'.','</v><v>')+'</v>' as xml) As xml 
From T 
) a outer apply ( Select x.y.value('.','varchar(100)') as val 
From a.xml.nodes('/v') x(y)) b
)
Select A from (
Select A,(Select Val+'' From CT Where A=A.A 
For xml Path('') 
) As X From Ct A Group by A
) S order by X
--用个自定义函数来拼也行
create   Function  f_splitS(@SourceSql   varchar(8000))   
Returns Varchar(8000)
As     
Begin  
Declare @Rst Varchar(8000)='' 
Declare   @ch   as   varchar(100)   
While charindex('.',@SourceSql)>0    
Begin   
 Set @ch=left(@SourceSql,charindex('.',@SourceSql,1)-1)   
 Set @Rst=@Rst+Right('0000'+@ch,4)
 Set @SourceSql=stuff(@SourceSql,1,charindex('.',@SourceSql,1),'')   
End  
Set @Rst=@Rst+Right('0000'+@SourceSql,4)
Return   @Rst
 End   
 go
Select * from T order by dbo.f_splitS(A)
性情中人的文库
2015-09-16 · TA获得超过481个赞
知道小有建树答主
回答量:219
采纳率:90%
帮助的人:153万
展开全部
可以用cast函数进行转换
更多追问追答
追问
能不能具体点
追答
cast(col as decimal)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
helly84
2015-09-16 · TA获得超过329个赞
知道小有建树答主
回答量:737
采纳率:77%
帮助的人:327万
展开全部
你想要什么结果啊?
追问
想要的结果是这样
1.1
1.1.1
1.1.2
1.2
2.1
3.1
4.1
10.1
10.1.1
10.1.2
11.1
追答
按照 .截取字符串吧,分成三个值,然后依次排序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式