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)

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-16
可以用cast函数进行转换追问

能不能具体点

追答

cast(col as decimal)

追问

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

第2个回答  2015-09-16
你想要什么结果啊?追问

想要的结果是这样
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语句中对一个字段排序,字段中含有字符串和数字,(怎根据数字进行排序...
order by 字段名称*1 desc\/asc的形式进行排序

sql 字符与数字排序
1是49 a是97 z就是123 只要让数字的码都大于字母就可以了,73是可以根据情况改的,要是有大写情况,也能处理 select Id from a order by (case when isNumEric(Id)=1 then ascii(Id)+73 else ascii(Id) end)

sql 字符串 排序
固定4个数字的话,截取左边4个字符 order by left( 列1 ,4 )如果是以数字开头,不确定字母位数,用下面这个.把表名和字段替换成你自己的.SELECT * FROM 表名 ORDER BY isnull(STUFF( 列1 ,PATINDEX('%[a-z]%', 列1 ),LEN( 列1 ) - 1,''), 列1 )字段内容可以为以数字开头的任...

sql数字字符串排序
--负责把字符串转换为Varbinary--思路,把字符串按.拆分,然后转换成int,再转换成varbinary拼接Create Function f_Order(@SourceSql Varchar(8000),@StrSeprate Varchar(2)) Returns Varbinary(8000)As Begin Declare @temp Varbinary(8000)=0x0Declare @ch Varchar(100) Set @Sourc...

...里含有数字还有汉字的如何使他们按照数字顺序排列
把数据做一次清理。提取数据里你需要进行排序的数据放在一个新字段里 查询时按提取的字段进行排序即可。注意数据类型哈 祝好运,望采纳。

sql语句,怎么排序才能把0排到最后
如果是字符的:order by (case columnname when '0' then 'a' else columnname end)数字的:order by (case columnname when 0 then 999999 else columnname)

SQL排序问题,我的数据有1 , 1.1 , 1.1.2 ,2 , 2.1 ,3, 3.1 ,3.2...
新建一个函数,将数据转化成 001,001001,001001002,002,002001,003,003001,然后按照字符来排序就好了

sql排序问题,字符串中有全数字和含中文的, 要求全数字的转换成整数排...
使用 ISNUMERIC函数就可以了,order by ISNUMERIC(字段),case when ISNUMERIC(字段)=0 then 0 else cast(字段 as bigint) end 还有小数的!!晕。那就把bigint改成 float order by ISNUMERIC(字段),case when ISNUMERIC(字段)=0 then 0 else cast(字段 as float) end ...

Sql Server 列中的数据有的是字母,有的是数字,要求先数字,后字母排序...
如果数字都是小于10的,可以直接order by,按照字符规则排序就是你想要的这个。如果数字有两位以上的,这时候11会排在2的前面,如果想数字按照数字的规则排序,字母按照字母的规则排序,需要根据条件将数字和字母分别查询出来进行排序,然后使用union all联接出结果。WITH tbtemp AS (SELECT '0' AS num...

请教!请问在SQL中 汉字字符是如何排序的?
对于 SQL Server -- 按照拼音来排序 1> SELECT 2> 3> FROM 4> Tab 5> ORDER BY 6> val COLLATE Chinese_PRC_CS_AS_KS_WS 7> go id val --- --- 2 二 3 三 4 四 5 五 1 一 (5 行受影响)-- 按照笔画数的多少来排序 1> SELECT 2> 3> FROM 4> Tab 5> OR...

相似回答