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 @> 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.56. Multirange Operators
Operator Description Example(s) |
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)} |
涉及到空区间或多区间时,左右/邻近运算符始终会返回 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_inc、upper_inc、lower_inf 和 upper_inf 函数都返回 false。