XYZ gibi tipik yazılım sürümü nasıl SİPARİŞ EDİLİR?


13

"SoftwareReleases" tablosu verildi:

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

Bu çıktıyı nasıl üretebilirim?

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

Yanıtlar:


22

İstediğiniz çıktıyı üretmek için şunları yapabilirsiniz:

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

Bir bütün textdiziyi bir integerdiziye atayabilir (daha 9önce sıralamak için 10).
Bir ORDER BYdizi türleri olabilir . Bu, her bir öğenin siparişi ile aynıdır. Ve daha kısa diziler, aynı öncü kısmı olan daha uzun dizilerden önce gelir.

db <> keman burada
Eski SQL Fiddle.


1
Bu harika. Her nasılsa, bu, eksik değerleri null sırasını belirtmeksizin doğru bir şekilde sıralar: (1.6.9 -> 1.7.1 -> 1.7 yerine) (1.6.9 -> 1.7 -> 1.7.1). Bunu kabul ediyorum.
Chris Betti

2
Maven sürümleri veya sayısal olmayan karakterler içerebilecek sürümlerle uğraşıyorsanız, önce sayısal olmayan karakterleri kaldırabilirsiniz:string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
Samuel

Bunu max sürümünü bulmak için kullanıyorum ve harika çalışıyorSELECT 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

Sürüm dizesinde daha fazla öğe bekliyorsanız, daha fazla dizi dizini kullanın. Dizin yoksa, sonuç null olur (örneğin v[10]geri döner null)


Bunları sayılara dönüştürmeniz mi gerekiyor? Aksi takdirde ve 10arasında olmasını beklerdim . 12
JNK

Bu keman tarafından onaylandı ...
JNK

Bunu benim lehime silmek. string_to_array normal ifadeden çok daha basittir.
Chris Betti

@JNK: bununla v[1]::intilgili. Dizeyi bir tamsayıya çevirir.
a_horse_with_no_name

SQL'inizde yapacağım tek değişiklik sipariştir. Ben desc çıkarmayı öneririz ve bu @Chris Betti aradığı sonuç kümesi yaratacaktır.
Paz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.