对点分隔的数字序列进行排序(例如,版本号)

时间:2015-06-27 14:46:47

标签: sql postgresql select sql-order-by

在我的数据库中,我列填充了这些数据:

1
1.1
1.1.1
1.1.1.1
1.1.2
1.10
1.11
1.2
1.9

我想对它进行排序,以获得如下结果:

1
1.1
1.1.1
1.1.1.1
1.1.2
1.2
1.9    
1.10
1.11

我怎样才能做到这一点?简单使用“ORDER BY”会产生错误的结果,因为它是字典顺序。

2 个答案:

答案 0 :(得分:6)

您可以将字符串拆分为数组,将其转换为int[]并依赖Postgres对数组的自然顺序:

SELECT   mycolumn
FROM     mytable
ORDER BY STRING_TO_ARRAY(mycolumn, '.')::int[] ASC

答案 1 :(得分:1)

投射到cidr会起作用(如果数字表现良好)

DROP table meuk;
CREATE table meuk
        ( id SERIAL NOT NULL PRIMARY KEY
        , version text
        );


INSERT INTO meuk(version) VALUES
 ('1' )
, ('1.1' )
, ('1.1.1' )
, ('1.1.1.1' )
, ('1.1.2' )
, ('1.10' )
, ('1.11' )
, ('1.2' )
, ('1.9' )
        ;

SELECT * FROM meuk
ORDER BY version::cidr
        ;

结果:

INSERT 0 9
 id | version 
----+---------
  1 | 1
  2 | 1.1
  3 | 1.1.1
  4 | 1.1.1.1
  5 | 1.1.2
  8 | 1.2
  9 | 1.9
  6 | 1.10
  7 | 1.11
(9 rows)