这个用正则就好了吧,比如WITH r AS
 (SELECT '1.1' x
  FROM   dual
  UNION ALL
  SELECT '1.2'
  FROM   dual
  UNION ALL
  SELECT '2'
  FROM   dual
   UNION ALL
  SELECT '2.1'
  FROM   dual
  UNION ALL
  SELECT '11.0.1'
  FROM   dual)
SELECT *
FROM   r
ORDER  BY nvl(0 + regexp_substr(x, '\d+', 1),-1),
          nvl(0 + regexp_substr(x, '\d+', 2),-1),
          nvl(0 + regexp_substr(x, '\d+', 3),-1),
          nvl(0 + regexp_substr(x, '\d+', 4),-1)

解决方案 »

  1.   


    WITH r AS
     (SELECT '1.1' x
      FROM   dual
      UNION ALL
      SELECT '1.2'
      FROM   dual
      UNION ALL
      SELECT '2'
      FROM   dual
       UNION ALL
      SELECT '2.1'
      FROM   dual
      UNION ALL
      SELECT '11.0.1'
      FROM   dual)
    SELECT *
    FROM   r
    ORDER  BY nvl(0 + regexp_substr(x, '\d+', 1,1),-1),
              nvl(0 + regexp_substr(x, '\d+', 1,2),-1),
              nvl(0 + regexp_substr(x, '\d+', 1,3),-1),
              nvl(0 + regexp_substr(x, '\d+', 1,4),-1)
      

  2.   

    我差不多也知道是这种思路 但是对oracle有点不太熟悉 能写出1.1,1.2之间排序 但是后面小数点一多 我就没撤了 所以能不能写个案例参考下呢,
      

  3.   

    写个函数,然后sql语句里调用,单用语句很复杂