2014-06-14 15 views
6

क्या पोस्टग्रेज़ में सॉफ़्टवेयर संस्करण (उदा। X.Y.Z> A.B.C) की तुलना करने का कोई तरीका है? मैं स्ट्रिंग/वर्कर या "संस्करण" प्रकार पर फ़ंक्शन खोज रहा हूं।पोस्टग्रेज़ में सॉफ़्टवेयर संस्करण की तुलना करें

मुझे लगता है कि http://pgxn.org/dist/semver/doc/semver.html में पता चला, लेकिन मैं विकल्पों की तलाश कर रहा हूँ (इतना आसान नहीं तैनात करने के लिए ..)

धन्यवाद एक बहुत।

+0

डेबियन ने इसके लिए एक एक्सटेंशन बनाया। डेबियन आधारित सिस्टम परिनियोजन के लिए 'debversion' http://pgxn.org/dist/debversion/ आसान है। – Jasen

उत्तर

7

आप संस्करण को सरणी में विभाजित कर सकते हैं और फिर 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

आपकी सलाह के बाद http://pastie.org/9290846 – 131

+2

स्ट्रिंग एरे की तुलना करना स्ट्रिंग की तुलना करने से बेहतर काम नहीं करता है - आपको अभी भी '1.9'> '1.10''' जैसी चीजें मिलती हैं। आप शायद अपने 'स्प्लिट' आउटपुट को 'int [] 'में डालना चाहते हैं। –

+0

@ निकबर्नेस, महान पकड़! जवाब आपके सुझाव के अनुसार अद्यतन किया गया है। – Fabricator

10

उपयोग सस्ता string_to_array()। यहाँ महंगा नियमित अभिव्यक्ति के लिए कोई जरूरत नहीं है:

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

शायद तुम एक pl समारोह में जोड़ सकते हैं, मेरे मामले में मैं अजगर और 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; 

आप postgresql-plpython पैकेज की आवश्यकता है।

संबंधित मुद्दे