pg_rational
使用BIGINT表示的有理数数据类型
仓库
begriffs/pg_rational
https://github.com/begriffs/pg_rational
源码
pg_rational-0.0.2.tar.gz
pg_rational-0.0.2.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_rational | 0.0.2 | TYPE | MIT | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3720 | pg_rational | 否 | 是 | 否 | 是 | 否 | 否 | - |
| 相关扩展 | prefix semver unit pgpdf pglite_fusion md5hash asn1oid roaringbitmap |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 0.0.2 | 1817161514 | pg_rational | - |
| RPM | PIGSTY | 0.0.2 | 1817161514 | pg_rational_$v | - |
| DEB | PGDG | 0.0.2 | 1817161514 | postgresql-$v-rational | - |
构建
您可以使用 pig build 命令构建 pg_rational 扩展的 RPM 包:
pig build pkg pg_rational # 构建 RPM 包
安装
您可以直接安装 pg_rational 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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 位(与 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 索引。