我有一个像这样的字符串:
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
答案 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