# 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)}”:int4multirange → t |
任意多量程 @> 任意范围 → 布尔值 多重范围是否包含范围? “{[2,4)}”:int4multirange@>int4range(2,3) → t |
任意多量程 @> 任何元素 → 布尔值 多重范围是否包含元素? “{[2011-01-012011-03-01])::tsmultirange@>“2011-01-10”::时间戳 → t |
任意范围 @> 任意多量程 → 布尔值 范围是否包含多重范围? “[2,4]”::int4range@>“{[2,3)}”::int4multirange → t |
任意多量程 <@ 任意多量程 → 布尔值 第一个多重范围是否包含在第二个多重范围中? “{[2,4)}”:int4multirange<@{[1,7)}”::int4multirange → t |
任意多量程 <@ 任意范围 → 布尔值 范围是否包含多重范围? “{[2,4)}”:int4multirange<@int4range(1,7) → t |
任意范围 <@ 任意多量程 → 布尔值 多重范围是否包含范围? int4range(2,4)<@'{[1,7}'::int4multirange → t |
任何元素 <@ 任意多量程 → 布尔值 元素是否包含在多重范围中? 42<'{[1,7}'::int4multirange → t |
任意多量程 && 任意多量程 → 布尔值 多个范围是否重叠,也就是说,有任何共同的元素? “{[3,7)}”:int8multirange&“{[4,12)}”:int8multirange → t |
任意多量程 && 任意范围 → 布尔值 多量程是否与量程重叠? “{[3,7}”:int8multirange&&int8range(4,12) → t |
任意范围 && 任意多量程 → 布尔值 该范围是否与多范围重叠? int8range(3,7)和&“{4,12}”:int8multirange → t |
任意多量程 << 任意多量程 → 布尔值 第一个多重范围严格地位于第二个多重范围的左边吗? “{[1,10}”:int8multirange<<”{[100110}”::int8multirange → t |
任意多量程 << 任意范围 → 布尔值 多重量程是否严格在量程的左边? “{[1,10}”:int8multirange<<int8range(100110) → t |
任意范围 << 任意多量程 → 布尔值 该范围是否严格位于多重范围的左侧? int8range(1,10)<<'{[100110)}'::int8multirange → t |
任意多量程 >> 任意多量程 → 布尔值 第一个多重音程严格地说是第二个多重音程的对吗? “{[50,60)}”:int8multirange>>“{[20,30)}”:int8multirange → t |
任意多量程 >> 任意范围 → 布尔值 多重射程是严格正确的吗? “{[50,60)}”:int8multirange>>int8range(20,30) → t |
任意范围 >> 任意多量程 → 布尔值 这个范围是不是严格正确的多重范围? int8range(50,60)>>'{[20,30}'::int8multirange → t |
任意多量程 &< 任意多量程 → 布尔值 第一个多重范围不延伸到第二个多重范围的右边吗? “{[1,20}”:int8multirange&<{[18,20}”:int8multirange → t |
任意多量程 &< 任意范围 → 布尔值 多量程是否未延伸到量程的右侧? “{[1,20)}”:int8multirange&<int8range(18,20) → t |
任意范围 &< 任意多量程 → 布尔值 该范围是否未延伸到多重范围的右侧? int8range(1,20)&<'{[18,20}':int8multirange → t |
任意多量程 &> 任意多量程 → 布尔值 第一个多重范围没有延伸到第二个多重范围的左边吗? “{[7,20}”:int8multirange&>“{[5,10}”:int8multirange → t |
任意多量程 &> 任意范围 → 布尔值 多量程是否未延伸到量程的左侧? “{[7,20)}”:int8multirange&>int8range(5,10) → t |
任意范围 &> 任意多量程 → 布尔值 该范围是否未延伸到多重范围的左侧? int8range(7,20)&>“{[5,10}”:int8multirange → t |
任意多量程 -|- 任意多量程 → 布尔值 多量程相邻吗? “{[1.1,2.2)}”:nummultirange-|-“{[2.2,3.3)}”:nummultirange → t |
任意多量程 -|- 任意范围 → 布尔值 多量程与量程相邻吗? “{[1.1,2.2}”:nummultirange-|-numrange(2.2,3.3) → t |
任意范围 -|- 任意多量程 → 布尔值 该范围是否与多范围相邻? numrange(1.1,2.2)-|-“{[2.2,3.3)}”:nummultirange → t |
任意多量程 + 任意多量程 → 任意多量程 计算多个范围的并集。多个范围不需要重叠或相邻。 “{[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.范围函数
表9.56.多量程函数
这个下奥公司
, upper_公司
, 下_inf
和上_inf
对于空范围或多范围,所有函数都返回false。