繁体   English   中英

Postgresql 中的比较字符串

[英]Comparison string in Postgresql

我的表:

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'或者最后一个查询怎么样?

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

我可以为您提供的最好的是用于“自然比较”的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM