2014-06-14 22 views
6

Có cách nào để so sánh phiên bản phần mềm (ví dụ: X.Y.Z> A.B.C) trong postgres không? Tôi đang tìm kiếm một hàm trên chuỗi/varchar hoặc một loại "phiên bản".So sánh phiên bản phần mềm trong postgres

tôi phát hiện ra rằng http://pgxn.org/dist/semver/doc/semver.html, nhưng tôi đang tìm kiếm giải pháp thay thế (không phải dễ dàng như vậy để triển khai ..)

Thanks a lot.

+0

debian đã tạo tiện ích mở rộng cho việc này. 'debversion' http://pgxn.org/dist/debversion/ để triển khai các hệ thống dựa trên debian thật dễ dàng. – Jasen

Trả lời

7

Bạn có thể chia phiên bản thành mảng và sau đó thực hiện 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

Làm theo lời khuyên của bạn http://pastie.org/9290846 – 131

+2

So sánh các mảng chuỗi không hoạt động tốt hơn so với chỉ đơn giản là so sánh các chuỗi - bạn vẫn nhận được những thứ như ''1.9'> '1,10''. Bạn có thể muốn bỏ đầu ra 'split' thành' int [] '. –

+0

@NickBarnes, bắt tuyệt vời! Câu trả lời đã được cập nhật theo đề xuất của bạn. – Fabricator

10

Sử dụng rẻ string_to_array(). Không cần phải cho biểu thức thông thường đắt tiền ở đây:

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

lẽ bạn có thể thêm một chức năng pl, trong trường hợp của tôi, tôi đã sử dụng python và 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; 

Bạn cần gói postgresql-plpython.

Các vấn đề liên quan