在我的数据库字段里面有一个 serial 的字段 
我写的语句是 select * from pro_task t order by t.tasserial
排序出来的结果是
id    serial
1      1
2      1.1
13     1.1.1
11     1.10
12     1.11
4      1.2
3      1.3
5      1.4
6      1.5
7      1.6
8      1.7
9      1.8
10     1.9
我想把1.10,1.11排到1.9 后面,可是怎么也排不到,希望各位大侠帮忙亚

解决方案 »

  1.   

    SQL> create or replace function f_mod(vstr varchar2) return varchar2
      2  as
      3  str varchar2(500);
      4  i number;
      5  str_rtn varchar2(600);
      6  str_temp varchar2(50);
      7  begin
      8  str:=vstr||'.';
      9  while instr(str,'.')>0 loop
     10     str_rtn:=str_rtn||lpad(substr(str,1,instr(str,'.')-1),3,'0');
     11     str:=substr(str,instr(str,'.')+1);
     12  end loop;
     13  return str_rtn||str;
     14  end f_mod;
     15  /函数已创建。已用时间:  00: 00: 00.31
    SQL> select f_mod('1.23.4.5.678.9') from dual;F_MOD('1.23.4.5.678.9')
    -----------------------------------------------------------------------------
    001023004005678009已用时间:  00: 00: 00.30SQL> select * from tbtemp;        ID SERIAL
    ---------- ------------------------------
             1 1
             1 1.1
             1 1.1.1
             1 2.1.1
             1 3
             1 1.9已选择6行。已用时间:  00: 00: 00.60
    SQL> select * from tbtemp order by f_mod(serial);        ID SERIAL
    ---------- ------------------------------
             1 1
             1 1.1
             1 1.1.1
             1 1.9
             1 2.1.1
             1 3已选择6行。
      

  2.   

    select * from pro_task t order by replace(to_char(t.tasserial),'.','')不知道是否可以!
      

  3.   

    order by to_number(substr(t.tasserial,1,instr(t.tasserial,'.')-1)),
          to_number(substr(t.tasserial,instr(t.tasserial,'.'),instr(t.tasserial,'.',1,2)-1)),
          to_number(substr(t.tasserial,instr(t.tasserial,'.',1,2),instr(t.tasserial,'.',1,3)-1))-------原理:先按第一个'.'前的数字排序,再按第一个'.'和第二个'.'之间的数字排序,以次类推。语句没有测试,原理就这样。不知道能不能满足楼主的需求。当然性能肯定好不了。
      

  4.   

    select * from pro_task t
    order by to_number(substr(serial, 3))