如何对版本号进行排序(如5.3.60.8)

时间:2016-07-25 13:46:30

标签: sql oracle

我有一个像这样的字符串:

5.3.60.8 
6.0.5.94
3.3.4.1

如何在Oracle SQL中按排序顺序对这些值进行排序?

我希望订单如下:

6.0.5.94
5.3.60.8
3.3.4.1

3 个答案:

答案 0 :(得分:3)

with
     inputs ( str ) as (
       select '6.0.5.94' from dual union all
       select '5.3.60.8' from dual union all
       select '3.3.4.1'  from dual
     )
select str from inputs
order by to_number(regexp_substr(str, '\d+', 1, 1)), 
         to_number(regexp_substr(str, '\d+', 1, 2)),
         to_number(regexp_substr(str, '\d+', 1, 3)),
         to_number(regexp_substr(str, '\d+', 1, 4))
;

STR
--------
3.3.4.1
5.3.60.8
6.0.5.94

答案 1 :(得分:1)

您可以在order by子句的左侧用零填充数字:

select   version
from     versions
order by regexp_replace(
            regexp_replace(version, '(\d+)', lpad('\1', 11, '0')),
            '\d+(\d{10})',
            '\1'
         ) desc

这适用于更多数字部分,最多约200个部分。

如果您希望数字超过10位数,请将作为第二个参数传递的数字增加到lpad函数,并将第二个正则表达式中的支撑数字增加。第一个应该是一个(因为\1是两个字符,但只能代表一个数字)。

最高版本

要仅获取最高版本,您可以使用特殊的Oracle rownum关键字将行号添加到上面的查询中。然后将所有内容包装在另一个select中,并在该行号上加上条件:

 select version
 from (
      select   version, rownum as row_num
      from     versions
      order by regexp_replace(
                  regexp_replace(version, '(\d+)', lpad('\1', 11, '0')),
                  '\d+(\d{10})',
                  '\1'
               ) desc)
where row_num <= 1;

有关其他选项,请参阅此https://github.com/sherif181/java-sequence-diagram-generator,具体取决于您的Oracle版本。

答案 2 :(得分:0)

我将在此处显示AskTom的答案,该答案可用于不同的版本大小:

or order_item.created_at is null