【问题标题】:Ordering dot-delimited numeric sequences (e.g., version numbers)排序点分隔的数字序列(例如,版本号)
【发布时间】:2015-09-14 09:33:29
【问题描述】:

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

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”会给出错误的结果,因为它是字典顺序。

【问题讨论】:

    标签: sql postgresql select sql-order-by


    【解决方案1】:

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

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

    【讨论】:

    • 它叫做string_to_array。除此之外,您的查询工作正常。
    • @Mureinik Freud 是关于你和你的侄女,而不是关于大写 :-)
    【解决方案2】:

    投射到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)
    

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2021-12-06
      • 2011-11-22
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多