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 展开
数据是字符串格式,如下
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 展开
3个回答
展开全部
--负责把字符串转换为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)
展开全部
可以用cast函数进行转换
更多追问追答
追问
能不能具体点
追答
cast(col as decimal)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你想要什么结果啊?
追问
想要的结果是这样
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
追答
按照 .截取字符串吧,分成三个值,然后依次排序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询