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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql排序,id本身为字符串,怎样转换为数字后排序相关的知识,希望对你有一定的参考价值。

参考技术A <p>很简单,因为你的id字段是字符型当然是以9开头最大,教你个方法,先将字符型转整形就可以了</p>
select max(ont_id+0) from oa_sys.dbo.tb_tes

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排序,id本身为字符串,怎样转换为数字后排序的主要内容,如果未能解决你的问题,请参考以下文章

在php中,怎样把数字转化为字符串

sql数字字符串排序

怎么让SQLServer的id按照数字大小顺序排序?

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

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

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