有没有办法在postgres中比较软件版本(例如X.Y.Z> A.B.C)?我在string / varchar或"版本"上搜索函数。类型。
我发现http://pgxn.org/dist/semver/doc/semver.html,但我正在寻找替代品(不太容易部署......)
非常感谢。
答案 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;
答案 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;
答案 2 :(得分:1)
另一种方法是使用
SHOW server_version_num;
这将返回一个易于比较的版本号。例如90610 for 9.6.10。
答案 3 :(得分:1)
正如已经建议的,一种简单的方法是使用数字格式的版本。 变量“ server_version_num”包含版本的数字格式。
例如。
版本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包。