[英]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.