# 9.20.量程/多量程函数和运算符

看见第8.17节有关范围类型的概述。

表9.53显示可用于范围类型的专用运算符。表9.54显示可用于多范围类型的专用运算符。除此之外,中还显示了常用的比较运算符表9.1适用于范围和多范围类型。比较运算符首先按范围下界排序,只有当它们相等时,才会比较上界。多量程运算符比较每个量程,直到其中一个量程不相等。这通常不会产生有用的整体排序,但提供运算符是为了允许在范围上构造唯一的索引。

表9.53.靶场操作员

操作人员

描述

例子
任意范围 @> 任意范围布尔值

第一个范围包含第二个范围吗?

int4range(2,4)@>int4range(2,3)t
任意范围 @> 任何元素布尔值

范围是否包含元素?

“[2011-01-012011-03-01]”::tsrange@>“2011-01-10”::时间戳t
任意范围 <@ 任意范围布尔值

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

int4range(2,4)<@int4range(1,7)t
任何元素 <@ 任意范围布尔值

元素是否包含在范围内?

42<@int4range(1,7)f
任意范围 && 任意范围布尔值

这些范围是否重叠,也就是说,有任何共同的元素?

int8range(3,7)和int8range(4,12)t
任意范围 << 任意范围布尔值

第一个范围严格地位于第二个范围的左边吗?

int8range(1,10)<<int8range(100110)t
任意范围 >> 任意范围布尔值

第一个范围严格地说是第二个范围吗?

int8range(50,60)>>int8range(20,30)t
任意范围 &< 任意范围布尔值

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

int8range(1,20)和<int8range(18,20)t
任意范围 &> 任意范围布尔值

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

int8range(7,20)和>int8range(5,10)t
任意范围 -|- 任意范围布尔值

这些区域相邻吗?

numrange(1.1,2.2)-|-numrange(2.2,3.3)t
任意范围 + 任意范围任意范围

计算范围的并集。范围必须重叠或相邻,以便联合是单个范围(但请参见range_merge()).

numrange(5,15)+numrange(10,20)[5,20)
任意范围 * 任意范围任意范围

计算范围的交点。

int8range(5,15)*int8range(10,20)[10,15)
任意范围 - 任意范围任意范围

计算范围的差异。第二个范围不得包含在第一个范围中,以使差异不是单个范围。

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

表9.54.多量程运算符

操作人员

描述

例子
任意多量程 @> 任意多量程布尔值

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

“{[2,4)}”:int4multirange@>“{[2,3)}”:int4multiranget
任意多量程 @> 任意范围布尔值

多重范围是否包含范围?

“{[2,4)}”:int4multirange@>int4range(2,3)t
任意多量程 @> 任何元素布尔值

多重范围是否包含元素?

“{[2011-01-012011-03-01])::tsmultirange@>“2011-01-10”::时间戳t
任意范围 @> 任意多量程布尔值

范围是否包含多重范围?

“[2,4]”::int4range@>“{[2,3)}”::int4multiranget
任意多量程 <@ 任意多量程布尔值

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

“{[2,4)}”:int4multirange<@{[1,7)}”::int4multiranget
任意多量程 <@ 任意范围布尔值

范围是否包含多重范围?

“{[2,4)}”:int4multirange<@int4range(1,7)t
任意范围 <@ 任意多量程布尔值

多重范围是否包含范围?

int4range(2,4)<@'{[1,7}'::int4multiranget
任何元素 <@ 任意多量程布尔值

元素是否包含在多重范围中?

42<'{[1,7}'::int4multiranget
任意多量程 && 任意多量程布尔值

多个范围是否重叠,也就是说,有任何共同的元素?

“{[3,7)}”:int8multirange&“{[4,12)}”:int8multiranget
任意多量程 && 任意范围布尔值

多量程是否与量程重叠?

“{[3,7}”:int8multirange&&int8range(4,12)t
任意范围 && 任意多量程布尔值

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

int8range(3,7)和&“{4,12}”:int8multiranget
任意多量程 << 任意多量程布尔值

第一个多重范围严格地位于第二个多重范围的左边吗?

“{[1,10}”:int8multirange<<”{[100110}”::int8multiranget
任意多量程 << 任意范围布尔值

多重量程是否严格在量程的左边?

“{[1,10}”:int8multirange<<int8range(100110)t
任意范围 << 任意多量程布尔值

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

int8range(1,10)<<'{[100110)}'::int8multiranget
任意多量程 >> 任意多量程布尔值

第一个多重音程严格地说是第二个多重音程的对吗?

“{[50,60)}”:int8multirange>>“{[20,30)}”:int8multiranget
任意多量程 >> 任意范围布尔值

多重射程是严格正确的吗?

“{[50,60)}”:int8multirange>>int8range(20,30)t
任意范围 >> 任意多量程布尔值

这个范围是不是严格正确的多重范围?

int8range(50,60)>>'{[20,30}'::int8multiranget
任意多量程 &< 任意多量程布尔值

第一个多重范围不延伸到第二个多重范围的右边吗?

“{[1,20}”:int8multirange&<{[18,20}”:int8multiranget
任意多量程 &< 任意范围布尔值

多量程是否未延伸到量程的右侧?

“{[1,20)}”:int8multirange&<int8range(18,20)t
任意范围 &< 任意多量程布尔值

该范围是否未延伸到多重范围的右侧?

int8range(1,20)&<'{[18,20}':int8multiranget
任意多量程 &> 任意多量程布尔值

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

“{[7,20}”:int8multirange&>“{[5,10}”:int8multiranget
任意多量程 &> 任意范围布尔值

多量程是否未延伸到量程的左侧?

“{[7,20)}”:int8multirange&>int8range(5,10)t
任意范围 &> 任意多量程布尔值

该范围是否未延伸到多重范围的左侧?

int8range(7,20)&>“{[5,10}”:int8multiranget
任意多量程 -|- 任意多量程布尔值

多量程相邻吗?

“{[1.1,2.2)}”:nummultirange-|-“{[2.2,3.3)}”:nummultiranget
任意多量程 -|- 任意范围布尔值

多量程与量程相邻吗?

“{[1.1,2.2}”:nummultirange-|-numrange(2.2,3.3)t
任意范围 -|- 任意多量程布尔值

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

numrange(1.1,2.2)-|-“{[2.2,3.3)}”:nummultiranget
任意多量程 + 任意多量程任意多量程

计算多个范围的并集。多个范围不需要重叠或相邻。

“{[5,10}”:nummultirange+“{[15,20}”::nummultirange{[5,10), [15,20)}
任意多量程 * 任意多量程任意多量程

计算多个范围的交点。

“{[5,15)}”:int8multirange*“{[10,20)}”:int8multirange{[10,15)}
任意多量程 - 任意多量程任意多量程

计算多个范围的差异。

“{[5,20)}”:int8multirange-“{[10,15)}”:int8multirange{[5,10), [15,20)}

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

在其他地方,空范围和多范围被视为加法标识:任何与空值联合的对象都是其本身。任何减去空值的东西都是它自己。空多量程与空量程具有完全相同的点。每个范围都包含空范围。每个多量程都包含任意多个空量程。

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

表9.55显示可用于范围类型的函数。表9.56显示可用于多范围类型的函数。

表9.55.范围函数

作用

描述

例子
降低 ( 任意范围 ) → 任何元素

提取范围的下限(无效的如果范围为空或下限为无穷大)。

下(努姆兰奇(1.1,2.2))1.1
上面的 ( 任意范围 ) → 任何元素

提取范围的上限(无效的如果范围为空或上限为无穷大)。

上部(努姆兰奇(1.1,2.2))2.2
我空虚 ( 任意范围 ) → 布尔值

靶场是空的吗?

isempty(numrange(1.1,2.2))f
下奥公司 ( 任意范围 ) → 布尔值

范围的下限是否包含在内?

下奥公司(numrange(1.1,2.2))t
upper_公司 ( 任意范围 ) → 布尔值

范围的上限是否包含在内?

upper_公司(numrange(1.1,2.2))f
下_inf ( 任意范围 ) → 布尔值

范围的下限是无限的吗?

下_inf(“(,)”::日期范围)t
上_inf ( 任意范围 ) → 布尔值

范围的上限是无限的吗?

上下(“(,)::日期范围)t
范围合并 ( 任意范围, 任意范围 ) → 任意范围

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

范围合并(“[1,2]”::int4range,“[3,4]”::int4range)[1,4)

表9.56.多量程函数

作用

描述

例子
降低 ( 任意多量程 ) → 任何元素

提取多重范围的下界(无效的如果多重范围为空或下限为无穷大)。

下(“{[1.1,2.2)}”::nummultirange)1.1
上面的 ( 任意多量程 ) → 任何元素

提取多重范围的上界(无效的如果多重范围为空或上限为无穷大)。

上限('{[1.1,2.2)}'::nummultirange)2.2
我空虚(德)任意多量程布尔值

多量程是空的吗?

isempty('{[1.1,2.2)}'::nummultirange)f
下奥公司(德)任意多量程布尔值

多重区间的下限是否包含在内?

lower_inc(“{[1.1,2.2])::nummultirange)t
upper_公司(德)任意多量程布尔值

多重范围的上限是否包含在内?

upper_inc(“{[1.1,2.2])::nummultirange)f
下_inf ( 任意多量程 ) → 布尔值

多重范围的下限是无限的吗?

下_inf('{(,)}'::datemultirange)t
上_inf ( 任意多量程 ) → 布尔值

多重值域的上界是无限的吗?

上_inf('{(,)}'::datemultirange)t
范围合并 ( 任意多量程 ) → 任意范围

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

range_merge('{[1,2],[3,4)}'::int4multirange)[1,4)
多量程 ( 任意范围 ) → 任意多量程

返回仅包含给定范围的多范围。

多量程(“[1,2]”::int4range){[1,2)}
不安 ( 任意多量程 ) → 任意范围集

将多重范围扩展为一组范围。按照存储顺序(升序)读取范围。

unnest(“{[1,2],[3,4])::int4multirange) → ``

<br/>[1,2)<br/>[3,4)<br/><br/>

这个下奥公司, upper_公司, 下_inf上_inf对于空范围或多范围,所有函数都返回false。