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

--负责把字符串转换为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)

参考技术A 可以用cast函数进行转换追问

能不能具体点

追答

cast(col as decimal)

追问

你这种不行撤
向“10.1.2”这种是字符串

参考技术B 你想要什么结果啊?追问

想要的结果是这样
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数字字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

sql排序,id本身为字符串,怎样转换为数字后排序

sql 字符串 排序

Linq to SQL - 如何将数字作为字符串排序?

sql:将字符类型字段转换成数字并排序

按字母数字字符串 MS SQL Server 2012 中的相似性排序

Mysql字符串中有数字的排序问题