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

范围类型的概述可参见 第 8.17 节

表 9.53显示了范围类型的专用操作符。 表 9.54显示了多范围类型的专用操作符。 除此之外,表 9.1中所示的常用比较操作符也适用于范围类型和多范围类型。 比较操作符首先按范围下界排序,只有当它们相等时才比较上界。 多范围操作符比较每个范围直到某一个为不相等。 这通常不会导致有用的总体排序,但提供的操作符允许在范围上构造惟一索引。

表 9.53. 范围操作符

操作符

描述

例子

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)


表 9.54. 多范围操作符

操作符

描述

示例

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

元素是否被多范围所包括?

42 <@ '{[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.55 显示可用于范围类型的函数。 表 9.56显示可用于多范围类型的函数。

表 9.55. 范围函数

函数

描述

例子

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

范围的下界是无限的吗?

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

upper_inf ( anyrange ) → boolean

范围的上界是无限的吗?

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

range_merge ( anyrange, anyrange ) → anyrange

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

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


表 9.56. 多范围函数

函数

描述

示例

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

多范围的下界是无限的么?

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

upper_inf ( anymultirange ) → boolean

多范围的上界是无限的么?

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_inf、 和 upper_inf 函数对空范围(empty range)或多范围都返回假(false)。