Postgresql 中文操作指南

9.20. Range/Multirange Functions and Operators #

有关范围类型的概述,请参阅 Section 8.17

Table 9.55 显示可用于范围类型的专有运算符。 Table 9.56 显示可用于多范围类型的专有运算符。除了这些之外, Table 9.1 中所示的通常比较运算符适用于范围和多范围类型。比较运算符首先按范围下限排序,仅当这些下限相等时,它们才会比较上限。多范围运算符比较每个范围,直至遇到不相等的范围为止。这通常不会产生有用的总体排序,但会提供运算符来允许在范围内构造唯一索引。

Table 9.55. Range Operators

Operator

Description

Example(s)

anyrange @> anyrangeboolean 第一个范围是否包含第二个范围? int4range(2,4) @> int4range(2,3)t

anyrange @> anyelementboolean 该范围是否包含该元素? '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestampt

anyrange <@ anyrangeboolean 第一个范围是否包含在第二个范围内? int4range(2,4) <@ int4range(1,7)t

anyelement <@ anyrangeboolean 该元素是否包含在该范围内? 42 <@ int4range(1,7)f

anyrange && anyrangeboolean 该范围是否重叠,即是否有任何公共元素? int8range(3,7) && int8range(4,12)t

anyrange << anyrangeboolean 第一个区间是否完全在第二个区间左侧? int8range(1,10) << int8range(100,110)t

anyrange >> anyrangeboolean 第一个区间是否完全在第二个区间右侧? int8range(50,60) >> int8range(20,30)t

anyrange &< anyrangeboolean 第一个区间是否不延伸到第二个区间的右侧? int8range(1,20) &< int8range(18,20)t

anyrange &> anyrangeboolean 第一个区间是否不延伸到第二个区间的左侧? int8range(7,20) &> int8range(5,10)t

anyrange _-

-_ anyrangeboolean 这两个区间是否相邻?-_numrange(1.1,2.2) -

- numrange(2.2,3.3)_ → t

anyrange + anyrangeanyrange 计算区间并集。两个区间必须重叠或相邻,这样并集才能是一个区间(但参见 range_merge() )。 numrange(5,15) + numrange(10,20)[5,20)

anyrange * anyrangeanyrange 计算区间交集。 int8range(5,15) * int8range(10,20)[10,15)

anyrange - anyrangeanyrange 计算区间差。第二个区间不能以这样的方式包含在第一个区间内,以至于差值不是一个区间。 int8range(5,15) - int8range(10,20)[5,10)

Table 9.56. Multirange Operators

Operator

Description

Example(s)

anymultirange @> anymultirangeboolean 第一个多区间是否包含第二个区间? '{[2,4)}'::int4multirange @> '{[2,3)}'::int4multiranget

anymultirange @> anyrangeboolean 多区间是否包含区间? '{[2,4)}'::int4multirange @> int4range(2,3)t

anymultirange @> anyelementboolean 多区间是否包含元素? '{[2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestampt

anyrange @> anymultirangeboolean 区间是否包含多区间? '[2,4)'::int4range @> '{[2,3)}'::int4multiranget

anymultirange <@ anymultirangeboolean 第一个多区间是否被第二个多区间包含? '{[2,4)}'::int4multirange <@ '{[1,7)}'::int4multiranget

anymultirange <@ anyrangeboolean 多区间是否被区间包含? '{[2,4)}'::int4multirange <@ int4range(1,7)t

anyrange <@ anymultirangeboolean 区间是否被多区间包含? int4range(2,4) <@ '{[1,7)}'::int4multiranget

anyelement <@ anymultirangeboolean 元素是否被多区间包含? 4 <@ '{[1,7)}'::int4multiranget

anymultirange && anymultirangeboolean 多区间是否重叠,即是否有任何公共元素? '{[3,7)}'::int8multirange && '{[4,12)}'::int8multiranget

anymultirange && anyrangeboolean 多区间是否与区间重叠? '{[3,7)}'::int8multirange && int8range(4,12)t

anyrange && anymultirangeboolean 区间是否与多区间重叠? int8range(3,7) && '{[4,12)}'::int8multiranget

anymultirange << anymultirangeboolean 第一个多区间严格位于第二个区间的左侧? '{[1,10)}'::int8multirange << '{[100,110)}'::int8multiranget

anymultirange << anyrangeboolean 多区间严格位于区间左侧? '{[1,10)}'::int8multirange << int8range(100,110)t

anyrange << anymultirangeboolean 区间严格位于多区间左侧? int8range(1,10) << '{[100,110)}'::int8multiranget

anymultirange >> anymultirangeboolean 第一个多区间严格位于第二个区间的右侧? '{[50,60)}'::int8multirange >> '{[20,30)}'::int8multiranget

anymultirange >> anyrangeboolean 多区间严格位于区间右侧? '{[50,60)}'::int8multirange >> int8range(20,30)t

anyrange >> anymultirangeboolean 区间严格位于多区间右侧? int8range(50,60) >> '{[20,30)}'::int8multiranget

anymultirange &< anymultirangeboolean 第一个多区间不延伸到第二个区间的右侧? '{[1,20)}'::int8multirange &< '{[18,20)}'::int8multiranget

anymultirange &< anyrangeboolean 多区间不延伸到区间右侧? '{[1,20)}'::int8multirange &< int8range(18,20)t

anyrange &< anymultirangeboolean 区间不延伸到多区间右侧? int8range(1,20) &< '{[18,20)}'::int8multiranget

anymultirange &> anymultirangeboolean 第一个多区间不延伸到第二个区间的左侧? '{[7,20)}'::int8multirange &> '{[5,10)}'::int8multiranget

anymultirange &> anyrangeboolean 多区间不延伸到区间左侧? '{[7,20)}'::int8multirange &> int8range(5,10)t

anyrange &> anymultirangeboolean 区间不延伸到多区间左侧? int8range(7,20) &> '{[5,10)}'::int8multiranget

anymultirange _-

-_ anymultirangeboolean 多区间相邻?-_'{[1.1,2.2)}'::nummultirange -

- '{[2.2,3.3)}'::nummultirange_ → t

anymultirange _-

-_ anyrangeboolean 多区间与区间相邻?-_'{[1.1,2.2)}'::nummultirange -

- numrange(2.2,3.3)_ → t

anyrange _-

-_ anymultirangeboolean 区间与多区间相邻?-_numrange(1.1,2.2) -

- '{[2.2,3.3)}'::nummultirange_ → t

anymultirange + anymultirangeanymultirange 计算多区间的并集。多区间不必重叠或相邻。 '{[5,10)}'::nummultirange + '{[15,20)}'::nummultirange{[5,10), [15,20)}

anymultirange * anymultirangeanymultirange 计算多区间的交集。 '{[5,15)}'::int8multirange * '{[10,20)}'::int8multirange{[10,15)}

anymultirange - anymultirangeanymultirange 计算多区间的差集。 '{[5,20)}'::int8multirange - '{[10,15)}'::int8multirange{[5,10), [15,20)}

涉及到空区间或多区间时,左右/邻近运算符始终会返回 false;也就是说,空区间不会被视为在任何其他区间之前或之后。

在其他地方,空区间和多区间会被视为加法单位:与空值联合的任何东西都是它本身。减去一个空值后的任何东西都是它本身。一个空的多区间与一个空区间具有完全相同的点。每个区间都包含空区间。每个多区间都包含任意数量的空区间。

如果结果区间需要包含两个不重叠的子区间时,区间并集和差集运算符将失败,因为无法表示这样的区间。有单独的运算符用于并集和差集,它们采用多区间参数并返回一个多区间,即使其参数不相交,它们也不会失败。因此,如果你需要对可能不相交的区间进行并集或差集操作,你可以通过首先将区间转换为多区间来避免错误。

Table 9.57 显示可用于范围类型的函数。 Table 9.58 显示可用于多范围类型的函数。

Table 9.57. Range Functions

Function

Description

Example(s)

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 返回 false) lower_inf('(,)'::daterange)t

upper_inf ( anyrange ) → boolean 该范围是否没有上限?(上限为 Infinity 返回 false) upper_inf('(,)'::daterange)t

range_merge ( anyrange , anyrange ) → anyrange 计算包含两个给定范围的最小范围。 range_merge('[1,2)'::int4range, '[3,4)'::int4range)[1,4)

Table 9.58. Multirange Functions

Function

Description

Example(s)

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 返回 false) lower_inf('{(,)}'::datemultirange)t

upper_inf ( anymultirange ) → boolean 该多范围是否没有上限?(上限为 Infinity 返回 false) 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_incupper_inclower_infupper_inf 函数都返回 false。