比较postgres中的软件版本

时间:2014-06-14 19:54:24

标签: postgresql version plpgsql version-sort

有没有办法在postgres中比较软件版本(例如X.Y.Z> A.B.C)?我在string / varchar或"版本"上搜索函数。类型。

我发现http://pgxn.org/dist/semver/doc/semver.html,但我正在寻找替代品(不太容易部署......)

非常感谢。

5 个答案:

答案 0 :(得分:20)

使用更便宜的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.

答案 1 :(得分: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

答案 2 :(得分:1)

另一种方法是使用

SHOW server_version_num;

这将返回一个易于比较的版本号。例如90610 for 9.6.10。

答案 3 :(得分:1)

正如已经建议的,一种简单的方法是使用数字格式的版本。 变量“ server_version_num”包含版本的数字格式。

例如。

  • 版本9.5.2 => 90502
  • 版本9.6.0 => 90600
  • 版本10.5 => 100500

    选择current_setting('server_version_num')

返回一个可以轻松与另一个版本号进行比较的数字。

答案 4 :(得分:0)

也许你可以添加一个pl函数,在我的例子中我使用了python和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包。