PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

9.20. 范围与多重范围函数及操作符 #

范围类型的概览请参见 Section 8.17。

Table 9.58 展示了可用于范围类型的专用操作符。 Table 9.59 展示了可用于多范围类型的专用操作符。 除此之外, Table 9.1 中展示的常规比较操作符也可用于范围和多范围类型。 比较操作符首先按范围的下界排序, 只有在下界相等时才比较上界。 多范围操作符会逐个比较每个范围, 直到有一个不相等为止。 这通常不会产生一个有用的整体排序, 但提供这些操作符是为了允许在范围上构建唯一索引。

Table 9.58. 范围操作符

操作符

说明

示例

anyrange @> anyrange → boolean

第一个范围是否包含第二个?

int4range(2,4) @> int4range(2,3) → t

anyrange @> anyelement → boolean

该范围是否包含该元素?

'[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp → t

anyrange <@ anyrange → boolean

第一个范围是否被包含在第二个之中?

int4range(2,4) <@ int4range(1,7) → t

anyelement <@ anyrange → boolean

该元素是否被包含在该范围之内?

42 <@ int4range(1,7) → f

anyrange && anyrange → boolean

这些范围是否重叠, 即是否有任何公共元素?

int8range(3,7) && int8range(4,12) → t

anyrange << anyrange → boolean

第一个范围是否严格位于第二个的左边?

int8range(1,10) << int8range(100,110) → t

anyrange >> anyrange → boolean

第一个范围是否严格位于第二个的右边?

int8range(50,60) >> int8range(20,30) → t

anyrange &< anyrange → boolean

第一个范围是否没有延伸到第二个的右边?

int8range(1,20) &< int8range(18,20) → t

anyrange &> anyrange → boolean

第一个范围是否没有延伸到第二个的左边?

int8range(7,20) &> int8range(5,10) → t

anyrange -|- anyrange → boolean

这些范围是否相邻?

numrange(1.1,2.2) -|- numrange(2.2,3.3) → t

anyrange + anyrange → anyrange

计算范围的并集。 这些范围必须重叠或相邻, 以使并集成为一个单一的范围 (但请参见 range_merge())。

numrange(5,15) + numrange(10,20) → [5,20)

anyrange * anyrange → anyrange

计算这些范围的交集。

int8range(5,15) * int8range(10,20) → [10,15)

anyrange - anyrange → anyrange

计算范围的差集。 第二个范围不得以这样的方式被包含在第一个范围中, 以致于差集不会是一个单一的范围。

int8range(5,15) - int8range(10,20) → [5,10)


Table 9.59. 多范围操作符

操作符

说明

示例

anymultirange @> anymultirange → boolean

第一个多范围是否包含第二个?

'{[2,4)}'::int4multirange @> '{[2,3)}'::int4multirange → t

anymultirange @> anyrange → boolean

该多范围是否包含该范围?

'{[2,4)}'::int4multirange @> int4range(2,3) → t

anymultirange @> anyelement → boolean

该多范围是否包含该元素?

'{[2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestamp → t

anyrange @> anymultirange → boolean

该范围是否包含该多范围?

'[2,4)'::int4range @> '{[2,3)}'::int4multirange → t

anymultirange <@ anymultirange → boolean

第一个多范围是否被包含在第二个之中?

'{[2,4)}'::int4multirange <@ '{[1,7)}'::int4multirange → t

anymultirange <@ anyrange → boolean

该多范围是否被包含在该范围之内?

'{[2,4)}'::int4multirange <@ int4range(1,7) → t

anyrange <@ anymultirange → boolean

该范围是否被包含在该多范围之内?

int4range(2,4) <@ '{[1,7)}'::int4multirange → t

anyelement <@ anymultirange → boolean

该元素是否被包含在该多范围之内?

4 <@ '{[1,7)}'::int4multirange → t

anymultirange && anymultirange → boolean

这些多范围是否重叠, 即是否有任何公共元素?

'{[3,7)}'::int8multirange && '{[4,12)}'::int8multirange → t

anymultirange && anyrange → boolean

该多范围是否与该范围重叠?

'{[3,7)}'::int8multirange && int8range(4,12) → t

anyrange && anymultirange → boolean

该范围是否与该多范围重叠?

int8range(3,7) && '{[4,12)}'::int8multirange → t

anymultirange << anymultirange → boolean

第一个多范围是否严格位于第二个的左边?

'{[1,10)}'::int8multirange << '{[100,110)}'::int8multirange → t

anymultirange << anyrange → boolean

该多范围是否严格位于该范围的左边?

'{[1,10)}'::int8multirange << int8range(100,110) → t

anyrange << anymultirange → boolean

该范围是否严格位于该多范围的左边?

int8range(1,10) << '{[100,110)}'::int8multirange → t

anymultirange >> anymultirange → boolean

第一个多范围是否严格位于第二个的右边?

'{[50,60)}'::int8multirange >> '{[20,30)}'::int8multirange → t

anymultirange >> anyrange → boolean

该多范围是否严格位于该范围的右边?

'{[50,60)}'::int8multirange >> int8range(20,30) → t

anyrange >> anymultirange → boolean

该范围是否严格位于该多范围的右边?

int8range(50,60) >> '{[20,30)}'::int8multirange → t

anymultirange &< anymultirange → boolean

第一个多范围是否没有延伸到第二个的右边?

'{[1,20)}'::int8multirange &< '{[18,20)}'::int8multirange → t

anymultirange &< anyrange → boolean

该多范围是否没有延伸到该范围的右边?

'{[1,20)}'::int8multirange &< int8range(18,20) → t

anyrange &< anymultirange → boolean

该范围是否没有延伸到该多范围的右边?

int8range(1,20) &< '{[18,20)}'::int8multirange → t

anymultirange &> anymultirange → boolean

第一个多范围是否没有延伸到第二个的左边?

'{[7,20)}'::int8multirange &> '{[5,10)}'::int8multirange → t

anymultirange &> anyrange → boolean

该多范围是否没有延伸到该范围的左边?

'{[7,20)}'::int8multirange &> int8range(5,10) → t

anyrange &> anymultirange → boolean

该范围是否没有延伸到该多范围的左边?

int8range(7,20) &> '{[5,10)}'::int8multirange → t

anymultirange -|- anymultirange → boolean

这些多范围是否相邻?

'{[1.1,2.2)}'::nummultirange -|- '{[2.2,3.3)}'::nummultirange → t

anymultirange -|- anyrange → boolean

该多范围是否与该范围相邻?

'{[1.1,2.2)}'::nummultirange -|- numrange(2.2,3.3) → t

anyrange -|- anymultirange → boolean

该范围是否与该多范围相邻?

numrange(1.1,2.2) -|- '{[2.2,3.3)}'::nummultirange → t

anymultirange + anymultirange → anymultirange

计算多范围的并集。 多范围无需重叠或相邻。

'{[5,10)}'::nummultirange + '{[15,20)}'::nummultirange → {[5,10), [15,20)}

anymultirange * anymultirange → anymultirange

计算多范围的交集。

'{[5,15)}'::int8multirange * '{[10,20)}'::int8multirange → {[10,15)}

anymultirange - anymultirange → anymultirange

计算多范围的差集。

'{[5,20)}'::int8multirange - '{[10,15)}'::int8multirange → {[5,10), [15,20)}


当涉及一个空范围或多范围时, 左侧/右侧/相邻操作符总是返回假; 也就是说, 一个空范围不被认为位于任何其他范围之前或之后。

在其他方面, 空范围和多范围被当作加法单位元: 任何与空值做并集的东西都是它自身。 任何减去一个空值的东西都是它自身。 一个空多范围与一个空范围拥有完全相同的点。 每个范围都包含空范围。 每个多范围都包含任意多的空范围。

如果结果范围需要包含两个不相交的子范围, 那么范围并集和差集操作符会失败, 因为这样的范围无法被表示。 对于并集和差集, 还有单独的操作符, 它们接受多范围参数并返回一个多范围, 即使它们的参数不相交也不会失败。 因此, 如果你需要对可能不相交的范围执行并集或差集操作, 可以先把你的范围转换为多范围来避免错误。

Table 9.60 展示了可用于范围类型的函数。 Table 9.61 展示了可用于多范围类型的函数。

Table 9.60. 范围函数

函数

说明

示例

lower ( anyrange ) → anyelement

提取范围的下界 (如果范围是空的或没有下界, 则为 NULL)。

lower(numrange(1.1,2.2)) → 1.1

upper ( anyrange ) → anyelement

提取范围的上界 (如果范围是空的或没有上界, 则为 NULL)。

upper(numrange(1.1,2.2)) → 2.2

isempty ( anyrange ) → boolean

该范围是否为空?

isempty(numrange(1.1,2.2)) → f

lower_inc ( anyrange ) → boolean

该范围的下界是否是包含的?

lower_inc(numrange(1.1,2.2)) → t

upper_inc ( anyrange ) → boolean

该范围的上界是否是包含的?

upper_inc(numrange(1.1,2.2)) → f

lower_inf ( anyrange ) → boolean

该范围是否没有下界? (下界为 -Infinity 会返回假。)

lower_inf('(,)'::daterange) → t

upper_inf ( anyrange ) → boolean

该范围是否没有上界? (上界为 Infinity 会返回假。)

upper_inf('(,)'::daterange) → t

range_merge ( anyrange, anyrange ) → anyrange

计算同时包含这两个给定范围的最小范围。

range_merge('[1,2)'::int4range, '[3,4)'::int4range) → [1,4)


Table 9.61. 多范围函数

函数

说明

示例

lower ( anymultirange ) → anyelement

提取多范围的下界 (如果多范围是空的或没有下界, 则为 NULL)。

lower('{[1.1,2.2)}'::nummultirange) → 1.1

upper ( anymultirange ) → anyelement

提取多范围的上界 (如果多范围是空的或没有上界, 则为 NULL)。

upper('{[1.1,2.2)}'::nummultirange) → 2.2

isempty ( anymultirange ) → boolean

该多范围是否为空?

isempty('{[1.1,2.2)}'::nummultirange) → f

lower_inc ( anymultirange ) → boolean

该多范围的下界是否是包含的?

lower_inc('{[1.1,2.2)}'::nummultirange) → t

upper_inc ( anymultirange ) → boolean

该多范围的上界是否是包含的?

upper_inc('{[1.1,2.2)}'::nummultirange) → f

lower_inf ( anymultirange ) → boolean

该多范围是否没有下界? (下界为 -Infinity 会返回假。)

lower_inf('{(,)}'::datemultirange) → t

upper_inf ( anymultirange ) → boolean

该多范围是否没有上界? (上界为 Infinity 会返回假。)

upper_inf('{(,)}'::datemultirange) → t

range_merge ( anymultirange ) → anyrange

计算包含整个多范围的最小范围。

range_merge('{[1,2), [3,4)}'::int4multirange) → [1,4)

multirange ( anyrange ) → anymultirange

返回一个只包含给定范围的多范围。

multirange('[1,2)'::int4range) → {[1,2)}

unnest ( anymultirange ) → setof anyrange

把一个多范围展开为一组按升序排列的范围。

unnest('{[1,2), [3,4)}'::int4multirange) →

 [1,2)
 [3,4)


对于一个空的范围或多范围, lower_inc、 upper_inc、 lower_inf 和 upper_inf 函数全都返回假。