我有一字段类型为Varchar的,格式大概为*.*.*的 该如何排序呢,默认排序的话 只会根据每位数进行排序,而我想根据.分隔符进行排序!

解决方案 »

  1.   

    可以使用instr,substr或者regexp_substr函数分解,然后再处理
      

  2.   

    1.1  1.2  1.10
    默认order的话会是 1.1  1.10 1.2 而我想要是1.1  1.2  1.10 
    分隔符'.'的个数是不一定的!
      

  3.   

    scott@SZTYORA> select * from test;COL1
    ----------------------------------------
    1.1
    1.2
    1.10-- 如果你的数据里每条记录只有一个句点的话,可以这样:已用时间:  00: 00: 00.00
    scott@SZTYORA> select col1,
      2         substr(col1,1,instr(col1,'.',1,1)-1) as c1,
      3         substr(col1,instr(col1,'.',1,1)+1) as c1
      4    from test
      5  order by lpad(substr(col1,1,instr(col1,'.',1,1)-1),4,0),
      6           lpad(substr(col1,instr(col1,'.',1,1)+1),4,0);COL1                                     C1                   C1
    ---------------------------------------- -------------------- --------------------
    1.1                                      1                    1
    1.2                                      1                    2
    1.10                                     1                    10已用时间:  00: 00: 00.01
      

  4.   

    -- 道理很简单:字符串排序:先左填充,再排序! 
    -- (如果能够确保字符串是合法的数值,也可以直接将得到的每部分字符串用to_number()函数转换成数值,
    --   再排序!方法很多,关键看自己肯不肯去动脑子啦!scott@SZTYORA>  select col1,
      2          substr(col1,1,instr(col1,'.',1,1)-1) as c1,
      3          substr(col1,instr(col1,'.',1,1)+1) as c1,
      4          lpad(substr(col1,1,instr(col1,'.',1,1)-1),4,0) cc1,
      5          lpad(substr(col1,instr(col1,'.',1,1)+1),4,0) cc2
      6     from test
      7    order by lpad(substr(col1,1,instr(col1,'.',1,1)-1),4,0),
      8             lpad(substr(col1,instr(col1,'.',1,1)+1),4,0);COL1                                     C1                   C1                   CC1               CC2
    ---------------------------------------- -------------------- -------------------- -------------------- --------------------
    1.1                                      1                    1                    0001              0001
    1.2                                      1                    2                    0001              0002
    1.10                                     1                    10                   0001              0010已用时间:  00: 00: 00.01
      

  5.   

    呵呵 谢谢,现在大概有5级吧,但是需求还没完全确定,可惜小弟plsql水平一般,里面不光是数字,还穿插各种字符。。很是郁闷啊!