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     |

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.


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)


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.