XYZのような一般的なソフトウェアリリースバージョンで注文する方法


13

「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     |

回答:


22

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

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

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

ここで db <> fiddle
古いSQL Fiddle。


1
これは素晴らしい。どういうわけか、これはnullの順序を指定する必要なく、欠損値を正しくソートします:(1.6.9-> 1.7.1-> 1.7)ではなく(1.6.9-> 1.7-> 1.7.1)。これを受け入れます。
Chris Betti

2
あなたはMavenのバージョンまたは数字以外の文字が含まれていてもよいバージョンを扱っている場合は、最初に数字以外の文字を削除することができます:string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
サミュエル

私はこれを使って最大バージョンを見つけ、それがうまくSELECT max(string_to_array(build_version, '.')::int[]
いきました

6
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


これらを数値に変換する必要がありますか?そうでなければ10、との間にある1と期待します2
JNK 2014

これはあなたのバイオリンで確認されています...
JNK 2014

これを支持して鉱山を削除します。string_to_arrayは正規表現よりもはるかに単純です。
Chris Betti、2014

@JNK:それが何であるかv[1]::intです。文字列を整数にキャストします。
a_horse_with_no_name 2014

私がSQLに加える唯一の変更は、注文者です。descを削除すると、@ Chris Bettiが探している結果セットが作成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.