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     |

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.


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)


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.