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

解决方案 »

  1.   

    select * from 表
    order by convert(int,replace(字段,'.',''))
      

  2.   

    不好意思,改一下:
    select * from 表
    order by 
             left(字段,6),
             convert(int,replace(字段,'.',''))
      

  3.   

    楼上2位,按照你们的SQL都不对,还是原来的排序顺序。可能我还没表达清楚。
    这个字段本身就是一个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
      

  4.   


    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   
    --楼主,上面就应该是你要的结果啊
      

  5.   

    to  aw511(点点星灯) :
    你在加上下面这几条数据看看结果
    insert @tab values('10.1')
    insert @tab values('10.2')
    insert @tab values('10.10.2')我希望的顺序是从1-9-10,它的顺序是1,10,2,3,4.....你还是没明白我的意思!
      

  6.   

    --创建自定义函数
    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 行)*/
      

  7.   

    select * from 表 order by replace(字段,' ','.')
    将后缀的空格统一替换成'.',再按此排序
      

  8.   

    如果是VARCHAR的先转成CHAR的吧
      

  9.   

    to  vivianfdlpw:
    请问在你的这个函数中,第二个参数@pos代表什么,传进去1,2,3各代表什么含义?谢谢!
      

  10.   

    另外,在下面这段代码中:
    ************************************
    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此?每次给函数输入的参数都不同,分别什么作用?
    您给出的结果是我最重想要的,但为什么这样做,我还不明白,希望您给以解答,谢谢!!
      

  11.   

    @pos代表要取第几个数,比如dbo.f_str('3.1.1.3 ',4)取第四个数,也就是3
    因为order by后面同一列不能出现多次,所以构造了具有相同值的四列,[num2][num3][num4]是代表别名