declare @tab table(str1 char(20))
insert @tab values('3.1.1')
insert @tab values('3.1.1.1')
insert @tab values('3.1.1.2')insert @tab values('3.1.1.2')
insert @tab values('3.1.1.10')
insert @tab values('3.1.1.11')
insert @tab values('3.1.1.3')select * from @tab
select * from @tab order by str1
select convert(varchar(20),str1) from @tab order by str1
order by convert(int,replace(字段,'.',''))
select * from 表
order by
left(字段,6),
convert(int,replace(字段,'.',''))
这个字段本身就是一个varchar型的,所以它里面存的数据就有各种形式的,我上面列出的3.1.1等等其实只是其中一段,正确的数据应该是从1开始一级一级增加下去,就好像书的目录一样(如下)
1
1.1
1.1.1
1.2
..
1.3
..
2
2.1
..
2.2
..
2.2.1
2.2.2
...
3
...
10
declare @tab table(str1 char(20))
insert @tab values('3.1.1')
insert @tab values('3.1.1.1')
insert @tab values('3.1.1.2')insert @tab values('3.1.1.2')
insert @tab values('3.1.1.10')
insert @tab values('3.1.1.11')
insert @tab values('3.1.1.3')insert @tab values('1.1')
insert @tab values('1')
insert @tab values('1.2')insert @tab values('2.1')
insert @tab values('2.2')
insert @tab values('2.2.2')
--select * from @tab
select * from @tab order by str1
--select convert(varchar(20),str1) from @tab order by str1--结果
str1
--------------------
1
1.1
1.2
2.1
2.2
2.2.2
3.1.1
3.1.1.1
3.1.1.10
3.1.1.11
3.1.1.2
3.1.1.2
3.1.1.3
--楼主,上面就应该是你要的结果啊
你在加上下面这几条数据看看结果
insert @tab values('10.1')
insert @tab values('10.2')
insert @tab values('10.10.2')我希望的顺序是从1-9-10,它的顺序是1,10,2,3,4.....你还是没明白我的意思!
if object_id('f_str') is not null
drop function f_str
go
create function f_str(@str varchar(30),@pos int)
returns int
as
begin
if len(@str)-len(replace(@str,'.',''))+1<@pos
return 0 if charindex('.',@str)=0
return convert(int,@str) declare @tmp int
set @tmp=1
while @tmp<@pos
begin
set @str=stuff(@str,1,charindex('.',@str),'')
set @tmp=@tmp+1
end if charindex('.',@str)=0
return convert(int,@str) return convert(int,left(@str,charindex('.',@str)-1))
end
go--创建测试环境
declare @tb table(num char(20))
insert @tb values('3.1.1')
insert @tb values('3.1.1.1')
insert @tb values('3.1.1.2')insert @tb values('3.1.1.2')
insert @tb values('3.1.1.10')
insert @tb values('3.1.1.11')
insert @tb values('3.1.1.3')insert @tb values('1.1')
insert @tb values('1')
insert @tb values('1.2')insert @tb values('2.1')
insert @tb values('2.2')
insert @tb values('2.2.2')
insert @tb values('10.1')
insert @tb values('10.2')
insert @tb values('10.10.2')--测试
select num from
(
select num,
[num2]=num,
[num3]=num,
[num4]=num
from @tb
)t
order by
dbo.f_str(num,1),
dbo.f_str(num2,2),
dbo.f_str(num3,3),
dbo.f_str(num4,4)--结果
/*
num
--------------------
1
1.1
1.2
2.1
2.2
2.2.2
3.1.1
3.1.1.1
3.1.1.2
3.1.1.2
3.1.1.3
3.1.1.10
3.1.1.11
10.1
10.2
10.10.2 (所影响的行数为 16 行)*/
将后缀的空格统一替换成'.',再按此排序
请问在你的这个函数中,第二个参数@pos代表什么,传进去1,2,3各代表什么含义?谢谢!
************************************
select num from
(
select num,
[num2]=num,
[num3]=num,
[num4]=num
from @tb
)t
order by
dbo.f_str(num,1),
dbo.f_str(num2,2),
dbo.f_str(num3,3),
dbo.f_str(num4,4)
***********************************************[num2][num3][num4]是代表别名的意思吗?为什么又要取4次呢?以及后面排序时,也要order by 4此?每次给函数输入的参数都不同,分别什么作用?
您给出的结果是我最重想要的,但为什么这样做,我还不明白,希望您给以解答,谢谢!!
因为order by后面同一列不能出现多次,所以构造了具有相同值的四列,[num2][num3][num4]是代表别名