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
我的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