Bagaimana cara MEMESAN DENGAN versi rilis perangkat lunak biasa seperti XYZ?

13

Diberikan tabel "SoftwareReleases":

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

Bagaimana saya menghasilkan output ini?

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

Jawaban:

22

Untuk menghasilkan output yang Anda inginkan, Anda dapat:

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

Satu dapat melemparkan seluruh textarray ke integerarray (untuk mengurutkan 9sebelumnya 10).
Satu dapat ORDER BYjenis array. Ini sama dengan pemesanan oleh masing-masing elemen. Dan array pendek datang sebelum yang lebih lama dengan bagian terkemuka yang identik.

db <> biola di sini
Old SQL Fiddle.

Erwin Brandstetter
sumber
1
Ini bagus. Entah bagaimana, ini mengurutkan nilai yang hilang dengan benar, tanpa harus menentukan urutan nulls: (1.6.9 -> 1.7 -> 1.7.1), daripada (1.6.9 -> 1.7.1 -> 1.7). Menerima yang ini.
Chris Betti
2
Jika Anda berurusan dengan versi Maven atau versi yang mungkin mengandung karakter non-numerik, Anda dapat menghapus karakter non-numerik terlebih dahulu:string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
Samuel
Saya menggunakan ini untuk menemukan versi maks dan itu berfungsi dengan baikSELECT max(string_to_array(build_version, '.')::int[]
Joviano Dias
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

Jika Anda mengharapkan lebih banyak elemen dalam string versi, cukup gunakan lebih banyak indeks array. Jika indeks tidak ada, hasilnya akan menjadi nol (mis. v[10]Akan kembali null)

seekor kuda tanpa nama
sumber
Apakah Anda perlu mengubahnya menjadi angka? Kalau tidak, saya akan berharap 10antara 1dan 2.
JNK
Ini dikonfirmasi oleh biola Anda ...
JNK
Menghapus milikku untuk ini. string_to_array jauh lebih sederhana daripada regex.
Chris Betti
@ JNK: itu tentang apa v[1]::int. Ini melemparkan string ke integer.
a_horse_with_no_name
Satu-satunya perubahan yang saya buat untuk SQL Anda adalah urutan. Saya sarankan menghapus desc dan itu akan membuat set hasil @Chris Betti cari.
Minggu