Wie BESTELLEN SIE NACH typischen Softwareversionen wie XYZ?

13

Bei einer "SoftwareReleases" -Tabelle:

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

Wie produziere ich diese Ausgabe?

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

Antworten:

22

Um die gewünschte Ausgabe zu erzielen, können Sie einfach:

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

Man kann ein ganzes textArray in ein integerArray umwandeln ( 9vorher sortieren 10).
Man kann ORDER BYArray-Typen. Dies entspricht der Bestellung nach jedem der Elemente. Und kürzere Arrays kommen vor längeren mit identischem Hauptteil.

db <> hier fummeln
Alte SQL-Geige.

Erwin Brandstetter
quelle
1
Das ist toll. Auf diese Weise werden fehlende Werte korrekt sortiert, ohne dass die Reihenfolge der Nullen angegeben werden muss: (1.6.9 -> 1.7 -> 1.7.1) anstelle von (1.6.9 -> 1.7.1 -> 1.7). Akzeptiere diesen.
Chris Betti
2
Wenn Sie mit Maven-Versionen oder Versionen arbeiten, die möglicherweise nicht numerische Zeichen enthalten, können Sie die nicht numerischen Zeichen zuerst entfernen:string_to_array(regexp_replace(version, '[^0-9.]', '', 'g'), '.')::int[]
Samuel
Ich benutze dies, um die maximale Version zu finden und es funktioniert großartigSELECT 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

Wenn Sie mehr Elemente in der Versionszeichenfolge erwarten, verwenden Sie einfach mehr Array-Indizes. Wenn der Index nicht existiert, ist das Ergebnis null (z. B. v[10]wird zurückgegeben null)

ein Pferd ohne Name
quelle
Müssen Sie diese in Zahlen umwandeln? Sonst würde ich erwarten 10, zwischen 1und zu sein 2.
JNK
Dies wird von Ihrer Geige bestätigt ...
JNK
Meine dafür löschen. string_to_array ist viel einfacher als Regex.
Chris Betti
@JNK: Darum geht v[1]::intes bei. Die Zeichenfolge wird in eine Ganzzahl umgewandelt.
a_horse_with_no_name
Die einzige Änderung, die ich an Ihrem SQL vornehmen würde, ist die Reihenfolge nach. Ich schlage vor, desc herauszunehmen und das wird die Ergebnismenge erzeugen, nach der @Chris Betti sucht.
So