Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

9.20. 范围/多重范围函数和运算符 #

请参阅第 8.17 节以了解范围类型的概述。

表 9.56 显示了可用于范围类型的专用运算符。 表 9.57 显示了可用于多重范围类型的专用运算符。此外,表 9.1 中显示的常规比较运算符还可用于范围和多重范围类型。比较运算符先按范围的下限排序,而仅当这些下限相等时才比较上限。多重范围运算符比较每个范围,直到有一个不相等。这通常不会产生有用的总体排序,但运算符可以构建基于范围的唯一索引。

表 9.56 范围运算符

运算符

描述

示例

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 &< anyrange布尔

第一个范围是否不延伸到第二个范围的右侧?

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

anyrange &> anyrange布尔

第一个范围是否不延伸到第二个范围的左侧?

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

anyrange -|- anyrange布尔

范围是否相邻?

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)


表 9.57. 多范围运算符

运算符

描述

示例

anymultirange @> anymultirange布尔

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

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

anymultirange @> anyrange布尔

多范围是否包含范围?

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

anymultirange @> anyelement布尔

多范围是否包含元素?

'{[2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestampt

anyrange @> anymultirange布尔

范围是否包含多范围?

'[2,4)'::int4range @> '{[2,3)}'::int4multiranget

anymultirange <@ anymultirange布尔

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

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

anymultirange <@ anyrange布尔

该多范围是否包含在这个范围内?

'{[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)}'::nummultiranget

anymultirange -|- anyrangeboolean

多重区间是否与区间相邻?

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

anyrange -|- anymultirangeboolean

区间是否与多重区间相邻?

numrange(1.1,2.2) -|- '{[2.2,3.3)}'::nummultiranget

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)}


当涉及到空范围或多范围时,左/右/相邻运算符总是返回假;也就是说,空范围不会被认为在任何其他范围之前或之后。

在其他地方,空范围和多范围被视为加法单位:任何与空值联合的都是它本身。减去空值的任何东西都是它本身。空多范围与空范围完全相同。每个范围都包含空范围。每个多范围都包含任意多个空范围。

如果所得范围需要包含两个不相交的子范围,则范围联合和差值运算符将失败,因为无法表示这样的范围。有单独用于联合和差值的运算符,它们采用多范围参数并返回多范围,即使它们的参数不相交也不会失败。因此,如果您需要对不相交的范围执行联合或差值操作,可以通过首先将范围强制转换为多范围来避免错误。

表 9.58 展示了可用于范围类型的函数。表 9.59 展示了可用于多范围类型的函数。

表 9.58 范围函数

函数

描述

示例

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)


表 9.59. 多范围函数

函数

描述

示例

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_incupper_inclower_infupper_inf 函数均返回假。