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

use*_*355 6 sql postgresql

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

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

Chr*_*lor 9

接受的答案确实适用于排序,但如果查询例如,将包括例如版本“10.1” version < '2'。请参阅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 test 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 test
WHERE version < '2.0'
ORDER BY version 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
Run Code Online (Sandbox Code Playgroud)

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