pg_rational

使用BIGINT表示的有理数数据类型

概览

扩展包名版本分类许可证语言
pg_rational0.0.2TYPEMITC
ID扩展名BinLibLoadCreateTrustReloc模式
3720pg_rational-
相关扩展prefix semver unit pgpdf pglite_fusion md5hash asn1oid roaringbitmap

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED0.0.21817161514pg_rational-
RPMPIGSTY0.0.21817161514pg_rational_$v-
DEBPGDG0.0.21817161514postgresql-$v-rational-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
d12.aarch64
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
d13.x86_64
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
d13.aarch64
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
u22.x86_64
u22.aarch64
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
u24.x86_64
u24.aarch64
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2
PGDG 0.0.2

构建

您可以使用 pig build 命令构建 pg_rational 扩展的 RPM 包:

pig build pkg pg_rational         # 构建 RPM 包

安装

您可以直接安装 pg_rational 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_rational;          # 当前活跃 PG 版本安装
pig ext install -y pg_rational -v 18  # PG 18
pig ext install -y pg_rational -v 17  # PG 17
pig ext install -y pg_rational -v 16  # PG 16
pig ext install -y pg_rational -v 15  # PG 15
pig ext install -y pg_rational -v 14  # PG 14
dnf install -y pg_rational_18       # PG 18
dnf install -y pg_rational_17       # PG 17
dnf install -y pg_rational_16       # PG 16
dnf install -y pg_rational_15       # PG 15
dnf install -y pg_rational_14       # PG 14
apt install -y postgresql-18-rational   # PG 18
apt install -y postgresql-17-rational   # PG 17
apt install -y postgresql-16-rational   # PG 16
apt install -y postgresql-15-rational   # PG 15
apt install -y postgresql-14-rational   # PG 14

创建扩展

CREATE EXTENSION pg_rational;

用法

pg_rational: 64 位精确分数运算

pg_rational 扩展提供了以 64 位(与 float 大小相同)存储的精确分数运算,并支持使用 Stern-Brocot 树查找中间分数。

CREATE EXTENSION pg_rational;

数据类型

  • rational:分数类型(分子/分母)
  • ratt:用于元组转换的辅助类型

基本运算

SELECT '1/3'::rational + '2/7'::rational;  -- 13/21
SELECT '3/4'::rational * '2/3'::rational;  -- 1/2

函数

-- 化简分数
SELECT rational_simplify('36/12');  -- 3/1

-- 查找中间分数(Stern-Brocot 树)
SELECT rational_intermediate('1/2', '2/3');  -- 3/5

类型转换

SELECT 0.263157894737::float::rational;  -- 5/19
SELECT '-1/2'::rational::float;          -- -0.5
SELECT 1::rational;                       -- 1/1

动态行排序

一个核心使用场景是在不重新编号的情况下维护可排序的行顺序:

CREATE TABLE todos (
    prio rational UNIQUE DEFAULT nextval('todos_seq')::integer,
    what text NOT NULL
);

-- 在优先级 1 和 2 之间插入
INSERT INTO todos VALUES (rational_intermediate('1', '2'), 'new task');
-- prio 变为 3/2,其他行不受影响

索引支持

rational 列支持 Btree 和 Hash 索引。


最后修改 2026-03-14: update extension metadata (953cbd0)