web-dev-qa-db-ja.com

X.Y.Zなどの一般的なソフトウェアリリースバージョンで注文する方法

「SoftwareReleases」テーブルがあるとします。

| id | version |
|  1 | 0.9     |
|  2 | 1.0     |
|  3 | 0.9.1   |
|  4 | 1.1     |
|  5 | 0.9.9   |
|  6 | 0.9.10  |

この出力を生成するにはどうすればよいですか?

| id | version |
|  1 | 0.9     |
|  3 | 0.9.1   |
|  5 | 0.9.9   |
|  6 | 0.9.10  |
|  2 | 1.0     |
|  4 | 1.1     |
13
Chris Betti

希望する出力を生成するには、単純に次のことができます。

SELECT id, version
FROM   versions
ORDER  BY string_to_array(version, '.')::int[];

text配列全体をinteger配列にキャストできます(910)。
1つできるORDER BY配列タイプ。これは、各要素による順序付けと同じです。そして、短い配列は、同じ先行部分を持つ長い配列よりも前に来ます。

db <> fiddle ここ
古いSQLフィドル

22
select id,
       name, 
       v[1] as major_version,
       v[2] as minor_version,
       v[3] as patch_level
from (
   select id, 
          name, 
          string_to_array(version, '.') as v
   from versions
) t
order by v[1]::int desc, v[2]::int desc, v[3]::int desc;

SQLFiddle: http://sqlfiddle.com/#!15/c9acb/1

バージョン文字列でより多くの要素が必要な場合は、より多くの配列インデックスを使用してください。インデックスが存在しない場合、結果はnullになります(例:v[10]nullを返します)

拡張機能semverを作成します。

softwareReleasesからバージョン、:semverの順序でID、バージョンを選択します。

http://www.pgxn.org/dist/semver/doc/semver.html

4
Russells