Postgres自然顺序

时间:2017-05-10 15:54:39

标签: sql postgresql sql-order-by

我在postgres中有一个排序问题,列中包含版本等值。 版本是字符变化的,其值如下(无序)。

1.2
1.3
1.10.1
1.9

如何按自然顺序排序,以便在我发出SELECT version FROM TABLE_A ORDER BY version DESC时它会给我

1.10.1
1.9
1.3
1.2

而不是

1.9
1.3
1.2
1.10.1

2 个答案:

答案 0 :(得分:6)

Postgres允许您按数组排序 - 这基本上是版本号所代表的。因此,您可以使用以下语法:

order by string_to_array(version, '.')::int[] desc

以下是一个完整的例子:

select *
from (values ('1'), ('2.1'), ('1.2.3'), ('1.10.6'), ('1.9.4')) v(version)
order by string_to_array(version, '.')::int[] desc;

甚至是demonstration

答案 1 :(得分:0)

一种方式:(如果版本可能有最多3个部分,则有效)

with t(col) as(
    select '1.9' union all
    select '2' union all
    select '1.2' union all
    select '1.10.1'  
)
select * from t
order by 
case when split_part(col, '.', 1) = '' then 0 else split_part(col, '.', 1)::int end desc, 
case when split_part(col, '.', 2) = '' then 0 else split_part(col, '.', 2)::int end desc, 
case when split_part(col, '.', 3) = '' then 0 else split_part(col, '.', 3)::int end desc