我有一个表中有一个字段为分类号,部分数据如下:
k822.1/1:1
k822.1/1:10
k822.1/1:11
k822.1/1:12
k822.1/1:2
k822.1/1:23
k822.1/1:3
要求排序后为:
k822.1/1:1
k822.1/1:2
k822.1/1:3
k822.1/1:10
k822.1/1:11
k822.1/1:12
k822.1/1:23

解决方案 »

  1.   


    Help me
    我在线等待呢
      

  2.   

    新添加一integer类型的排序字段,把最后一个:后面的数据放进去
      

  3.   


    to eagle123(孤独的鹰) 
    这种方法恐怕不行,因为.与/之间,/与:之间都有可能出现上面类似的情况
    而且还有可能出现这样的数据:
    A463/1:B0
    A465/1:E29
    A467/1:G03
    天哪,我该怎么办啊,如果能像pb里面的数据窗口那样对数据分组就好了
      

  4.   

    是否可以将问题理解为对字符串进行排序?
    如果是:
    增设一个数字型字段:idint。
    自己编制一个n进制的算法,将你的“分类号”字符串转换为整数存入idint。
    (  * n进制:据你的字符串中可能出现的字符数而定n值。)结果数据集按idint排序。
      

  5.   

    把k822.1/1:12分拆成四个field,即k822   
                                   1
                                   1
                                   12
    然后再合并
      

  6.   

    to kevincomein(白菜) 还有可能出现这样的数据:
    A463/1:B0
    A465/1:E29
    A467/1:G03
      

  7.   


    to tianyc(贝壳)自己编制一个n进制的算法,将你的“分类号”字符串转换为整数存入idint。
    (  * n进制:据你的字符串中可能出现的字符数而定n值。)可否举一个例字,例如A467/1:G03如何转化,n应该为几?
      

  8.   

    To  erickleung()  
      要分两段来排, 问题是如何把单一字段, 由尾开始, 撷取数字部份, 其馀为首字段.如果是k822.1/1:1,应该分为哪两部分
    是否要将k./:作为第一部分,822111作为第二部分呢? 
     
      

  9.   

    q确定优先顺序ABCD……,0123……,:/等,再排序
      

  10.   

    把 k822.1/1:1 变成 k822.1/1:01  ,
    就可以直接用 order by 来排序。
    这样比较容易解决。
      

  11.   


    例如:你的序列号中如果只可能有[0 1 2 3 4 5 6 7 8 9 A G K / . :]的出现,则n值就取为16。要将“K/8”转成整数:12*16*16+13*16+8=3288,
    要将“A10G”转成整数:10*16*16*16+1*16*16+0*16+11=41227对“K/8”和“A10G”两行记录按自己转换出的整数升序排列结果则为:
      “K/8”  ....    3288
      “A10G” ....   41227(为了减少麻烦,你最好将你的编码在存盘前转为大写。)
    你再好好体会一下祝你成功!
      

  12.   

    强烈推荐!强烈推荐全新的调查!
    强烈推荐!强烈推荐!强烈推荐全新的调查!
    强烈推荐!强烈推荐!强烈推荐!强烈推荐全新的调查,谢谢!http://www.csdn.net/Expert/TopicView1.asp?id=655336
      

  13.   

    在表中在建立一个足够长的字符字段,将分类号按如下规则转换后存入该字段,然后按该字段来排序。
    转换规则:将分类号中的连续的数字变为有前导0的等宽数字
    以下是转换为5位宽的数字:
    k822.1/1:1   => k00822.00001/00001:00001
    k822.1/1:10  => k00822.00001/00001:00010
    k822.1/1:11  => k00822.00001/00001:00011
    k822.1/1:12  => k00822.00001/00001:00012
    k822.1/1:2   => k00822.00001/00001:00002
    k822.1/1:23  => k00822.00001/00001:00023
    k822.1/1:3   => k00822.00001/00001:00003以下是我用过的转换函数:
    function FilterDigit(const s:string; aWidth:integer):string;
    const
            DSet:set of char = ['0'..'9'];
    var
            sZero, stemp: string;
            i: integer;
    begin
            Result := '';
            sZero := StringOfChar('0', aWidth);
            stemp := '';
            for i := 1 to length(s) do
            begin
                    if s[i] in DSet then
                    begin
                            stemp := stemp + s[i];
                    end else
                    begin
                      if stemp <> '' then
                      begin
                            stemp := sZero + sTemp;
                            stemp := copy(stemp, length(stemp) - awidth + 1, awidth);
                            Result := Result + stemp;
                            stemp := '';
                      end;
                      Result := Result + s[i];
                    end;        end;
            if stemp <> '' then
            begin
                  stemp := sZero + sTemp;
                  stemp := copy(stemp, length(stemp) - awidth + 1, awidth);
                  Result := Result + stemp;
                  stemp := '';
            end;end;调用FilterDigit('A467/1:G03', 5)就返'A00467/00001:G00003'
      

  14.   

    我的想法和netkid 的一样,这样很简单。不妨一试
      

  15.   

    建议使用netkid的方法,简单,有效
      

  16.   

    Try this :
    select substring(pformno,6,len(pformno)-6)) as tem  from yourtable order by tem
      

  17.   


    好久没来了,所以一直没结贴,没想到还有这么多朋友帮忙
    那个问题已经解决了,是采用类似kevincomein(白菜) 的办法,
    将分类好分为四段.要是早一点看到 guig(胖胖),就会采用guig(胖胖)的办法.一会结贴