2014-06-14 31 views

Odpowiedz

7

Można podzielić wersję na tablicę, a następnie wykonać 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

Postępując zgodnie z twoją radą http://pastie.org/9290846 – 131

+2

Porównywanie tablic ciągów nie działa lepiej niż zwykłe porównywanie ciągów znaków - nadal masz takie słowa, jak '' 1.9 '>' 1.10''. Prawdopodobnie chcesz rzucić swoje wyjście 'split' na' int [] '. –

+0

@NickBarnes, świetny połów! Odpowiedź została zaktualizowana zgodnie z Twoją sugestią. – Fabricator

10

Użyj tańsze string_to_array(). Nie ma potrzeby stosowania drogich wyrażeń regularnych tutaj:

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

Może można dodać funkcję pl, w moim przypadku użyłem Python i 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; 

Ty potrzebujesz pakietu postgresql-plpython.