跳到主要内容

范围/多范围函数和运算符

范围类型存储一种元素类型的区间,例如 int4range、daterange、tsrange、tstzrange;多范围类型存储多个互不重叠的范围。它们比两个独立端点列更直接地表达包含、相交和边界语义。

端点与关系​

SELECT int4range(1, 5) @> 3; -- true
SELECT int4range(1, 5) && int4range(4, 8); -- true
SELECT lower(int4range(1, 5)), upper(int4range(1, 5)); -- 1、5
SELECT lower_inc(int4range(1, 5)), upper_inc(int4range(1, 5)); -- true、false

默认边界是 [):包含下界、不包含上界。@> 表示包含元素或范围,<@ 表示被包含,&& 表示重叠;-|- 表示相邻但不重叠。isempty 判断空范围,lower_inf、upper_inf 判断是否无限边界。无限边界不等于取到一个具体的 infinity 元素。

合并与差集​

SELECT int4range(1, 3) + int4range(3, 6); -- [1,6)
SELECT int4range(1, 5) * int4range(4, 7); -- [4,5)
SELECT int4multirange(int4range(1, 3), int4range(5, 7));

范围 + 求并集、* 求交集;若并集不能表示为一个连续范围,普通范围 + 会报错,可以使用对应多范围表示不连续结果。range_merge(multirange) 返回覆盖所有成员的最小范围,可能填入原来的空隙,不能当作无损并集。

建模注意​

离散类型范围会规范化边界表示,因此打印结果可能与输入形式不同,但表示的值集合相同。时间预约更适合 [开始, 结束),相邻预约就不重叠。针对重叠查询可使用 GiST 索引;防止同一资源时间段重叠可考虑排除约束,并核对并发行为和 NULL 策略。多范围支持始于 PostgreSQL 14,旧版本需另行建模。