Postgresql 中的比较字符串

Comparison string in Postgresql

我的table:

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

在那table我存储了我在一些项目中使用的软件和它们的版本,我通过比较它们的版本来检查它们何时更新。我需要将版本信息存储为字符串,因为某些版本包含诸如“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' 或者最后一个查询怎么样?

通常,最好的解决方案是将版本号转换为数字。

我能为您提供的最好的是用于“自然比较”的 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”小于一个空字符串,而其他字符串不是。

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