首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Postgres中对包含语义版本的列进行排序

如何在Postgres中对包含语义版本的列进行排序
EN

Stack Overflow用户
提问于 2021-04-20 08:20:06
回答 2查看 140关注 0票数 0

有没有一种方法可以有效地在Postgres中存储https://semver.org版本字符串,然后执行最新的查询。例如,假设列具有值1.1.0、1.0.0、1.2.0、1.0.1-rc.1+B001。我想排序并获得最新的版本号(1.2.0),理想情况下是一个优化的和高性能的查询,因为它将被频繁查询。

注意:我想对单个列进行排序,并获取最新信息,而不是比较两个不同的列。也希望它是完全符合semver。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-20 13:09:21

尝试使用自然排序顺序的ICU排序规则:

代码语言:javascript
运行
复制
CREATE COLLATION en_natural (
   LOCALE = 'en-US-u-kn-true',
   PROVIDER = 'icu'
);

如果你使用ORDER BY somecol COLLATE en_natural,你应该能得到你想要的东西。

DB Fiddle

票数 2
EN

Stack Overflow用户

发布于 2021-11-17 20:01:35

Accepted确实适用于排序,但如果查询version < '2',则将包含版本"10.1“。参见https://dbfiddle.uk/?rdbms=postgres_12&fiddle=ad031218fe4c941f29c9b03de80d54e0

相反,如果在列上定义排序规则,则在按版本过滤时会得到正确的结果:

代码语言:javascript
运行
复制
CREATE COLLATION en_natural (
  LOCALE = 'en-US-u-kn-true',
  PROVIDER = 'icu'
);

CREATE TABLE test (
  version varchar(20) collate en_natural
);

insert into versions values
('10.1'),
('2.1'),
('1.2.9'),
('1.24'),
('1.23.231+b'),
('1.23.231+a'),
('1.23'),
('1.23.231-test.beta'),
('1.23.231-test.alpha'),

('1.23.45-rc.2+B001'),
('0.9');

SELECT *
FROM versions
WHERE v1 < '2.0'
ORDER BY v1 desc;

-- note results do not include 10.1
1.24
1.23.231+b
1.23.231+a
1.23.231-test.beta
1.23.231-test.alpha
1.23.45-rc.2+B001
1.23
1.2.9
0.9

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=a284745f2b55617a964c777c29b7e745

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67170865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档