Sql 博士后自然秩序

Sql 博士后自然秩序,sql,postgresql,sql-order-by,Sql,Postgresql,Sql Order By,我在postgres的一列中有一个排序问题,它的值是version。 版本是字符变化的,具有如下未排序的值 1.2 1.3 1.10.1 1.9 如何按自然顺序排序,以便在我从表中发出SELECT version(选择版本)时,它会按版本说明进行排序 1.10.1 1.9 1.3 1.2 而不是 1.9 1.3 1.2 1.10.1 Postgres允许您按数组排序,这基本上就是版本号所表示的。因此,您可以使用以下语法: order by string_to_array(version,

我在postgres的一列中有一个排序问题,它的值是version。 版本是字符变化的,具有如下未排序的值

1.2
1.3
1.10.1
1.9
如何按自然顺序排序,以便在我从表中发出SELECT version(选择版本)时,它会按版本说明进行排序

1.10.1
1.9
1.3
1.2
而不是

1.9
1.3
1.2
1.10.1

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;

即使是一个。

单向:如果版本最多有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

您的版本代码可能有多少个数字?谢谢Gordon。我不得不处理一组更糟糕的数据。但你暗示了解决办法。从值“1”、“2.1”、“1.2.3”、“1.10.6”、“1.10.10”、“1.10”、“1.9.4”、“1.9.BETA”中选择*按字符串的版本顺序“\u到数组regexp\u替换数组\u到字符串regexp\u匹配版本”[\d\.]+”、“\.$”::int[]desc;