0

我的桌子:

CREATE TABLE public.software
(
    software_name text COLLATE pg_catalog."default",
    version text COLLATE pg_catalog."default", 
)

在该表中,我存储了在某些项目中使用的软件及其版本,并通过比较它们的版本来检查它们是否更新。我需要将版本信息存储为字符串,因为某些版本包含像“1.0.1-beta”这样的字符串。

我仍然找不到比较字符串的最佳方法。我使用以下(简化)查询:

    SELECT '1.2.3' < '1.2.4' -- true


    SELECT '1.2.3a' < '1.2.4B'

当我运行以下查询时:

select '3.0.0' > '26752' -- true

select '1.2.3a' < '1.2.3A' -- true

select 'i dont know' >= '2' --true

但是 3.0.0 小于 26752。1.2.3a (可能)是假的,如果我使用 lower() 函数我可以解决它。select '3.0.0' > '26752'或最后一个查询怎么样?

4

2 回答 2

0

我安装了 semver 扩展,效果很好!谢谢@arun

于 2020-02-28T17:10:46.333 回答
0

一般来说,最好的解决方案是将版本号转换为数字。

我可以为您提供的最好的方法是用于“自然比较”的 ICU 排序规则(可从 PostgreSQL v10 开始):

CREATE COLLATION en_natural (
   provider = icu,
   locale = 'en-US-u-kn-true'
);

ALTER TABLE public.software
   ALTER version TYPE text COLLATE en_natural;

那将尽最大努力。

当然,1.0.1仍然会小于1.0.1-beta3,以及小于1.0.1a,因为没有内置知识“beta”小于空字符串,而其他字符串则不是。

于 2020-02-25T11:49:06.760 回答