sql数字字符串排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql数字字符串排序相关的知识,希望对你有一定的参考价值。
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
--思路,把字符串按.拆分,然后转换成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) 参考技术A 可以用cast函数进行转换追问
能不能具体点
追答cast(col as decimal)
追问你这种不行撤
向“10.1.2”这种是字符串
想要的结果是这样
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
按照 .截取字符串吧,分成三个值,然后依次排序
以上是关于sql数字字符串排序的主要内容,如果未能解决你的问题,请参考以下文章