2014-06-14 21 views
6

C'è un modo per confrontare la versione del software (ad esempio X.Y.Z> A.B.C) in postgres? Sto cercando una funzione su string/varchar o un tipo di "versione".Confronta la versione del software in postgres

ho scoperto che http://pgxn.org/dist/semver/doc/semver.html, ma io sono alla ricerca di alternative (non così facile da implementare ..)

Grazie mille.

+0

debian ha creato un'estensione per questo. 'debversion' http://pgxn.org/dist/debversion/ per la distribuzione di sistemi basati su debian è facile. – Jasen

risposta

7

È possibile dividere la versione in serie e quindi fare array comparison.

select regexp_split_to_array(v1, '\.')::int[] v1, 
     regexp_split_to_array(v2, '\.')::int[] v2, 
     regexp_split_to_array(v1, '\.')::int[] > regexp_split_to_array(v2, '\.')::int[] cmp 
from versions; 

demo

+0

Seguendo il tuo consiglio http://pastie.org/9290846 – 131

+2

Confrontando gli array di stringhe non funziona meglio del semplice confronto delle stringhe - ottieni ancora cose come ''1.9'> '1.10''. Probabilmente vuoi trasmettere l'output di 'split' a' int [] '. –

+0

@NickBarnes, ottima cattura! La risposta è stata aggiornata secondo il tuo suggerimento. – Fabricator

10

Utilizzare il più economico string_to_array(). Non v'è alcuna necessità di costosi espressioni regolari qui:

SELECT string_to_array(v1, '.')::int[] AS v1 
    , string_to_array(v2, '.')::int[] AS v2 
    ,(string_to_array(v1, '.')::int[] > string_to_array(v2, '.')::int[]) AS cmp 
FROM versions; 

SQL Fiddle.

0

Forse si può aggiungere una funzione pl, nel mio caso ho usato python e distutils.version:

CREATE FUNCTION _is_major (a text, b text) 
    RETURNS boolean 
AS $$ 
    from distutils.version import LooseVersion 
    return LooseVersion(a) > LooseVersion(b) 
$$ LANGUAGE PLPYTHONU; 

È ho bisogno del pacchetto postgresql-plpython.

Problemi correlati