有没有一种方法可以有效地在Postgres中存储https://semver.org版本字符串,然后执行最新的查询。例如,假设列具有值1.1.0、1.0.0、1.2.0、1.0.1-rc.1+B001。我想排序并获得最新的版本号(1.2.0),理想情况下是一个优化的和高性能的查询,因为它将被频繁查询。
注意:我想对单个列进行排序,并获取最新信息,而不是比较两个不同的列。也希望它是完全符合semver。
发布于 2021-04-20 13:09:21
尝试使用自然排序顺序的ICU排序规则:
CREATE COLLATION en_natural (
LOCALE = 'en-US-u-kn-true',
PROVIDER = 'icu'
);如果你使用ORDER BY somecol COLLATE en_natural,你应该能得到你想要的东西。
发布于 2021-11-17 20:01:35
Accepted确实适用于排序,但如果查询version < '2',则将包含版本"10.1“。参见https://dbfiddle.uk/?rdbms=postgres_12&fiddle=ad031218fe4c941f29c9b03de80d54e0。
相反,如果在列上定义排序规则,则在按版本过滤时会得到正确的结果:
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.9https://dbfiddle.uk/?rdbms=postgres_12&fiddle=a284745f2b55617a964c777c29b7e745
https://stackoverflow.com/questions/67170865
复制相似问题