目录
文档用途
范围类型是表达某种元素类型的一个值的范围的数据类型。
范围类型非常有用,因为它们可以表达一种单一范围值中的多个元素值,并且可以很清晰地表达诸如范围重叠等概念。例如,范围类型可以用于表示时间和日期范围。
详细信息
1.内建范围类型
PostgreSQL带有下列内建范围类型:
1) int4range (integer的范围)
2) int8range (bigint的范围)
3) numrange (numeric的范围)
4) tsrange (不带时区的timestamp的范围)
5) tstzrange (带时区的timestamp的范围)
6) daterange (date的范围)
此外,可以使用自定义的范围类型。
2.范围函数和操作符
2.1范围操作符
操作符 |
描述 |
例子 |
结果 |
= |
等于 |
int4range(2,7)='[2,6]'::int4range |
true |
<> |
不等于 |
numrange(2.1,3.2)<>numrange(2.1,3.3) |
true |
< |
小于 |
int4range(2,7)<int4range(3,5) |
true |
> |
大于 |
int4range(2,7)>int4range(2,5) |
true |
<= |
小于等于 |
int4range(2,7)<=int4range(2,7) |
true |
>= |
大于等于 |
int4range(2,7)>=int4range(2,5) |
true |
@> |
包含范围 |
int4range(2,7)@>int4range(2,5) |
true |
@> |
包含元素 |
'[2018-10-30,2018-11-30]'::tsrange@>'2018-11-01'::timestamp |
true |
<@ | 范围被包含 | int4range(2,5)<@int4range(1,6) | true |
<@ | 元素被包含 | 3<@int4range(1,6) | true |
&& | 重叠(有公共点) | int4range(2,5)&&int4range(1,6) | true |
<< | 严格左 | int4range(2,5)<<int4range(1,10) | true |
>> | 严格右 | int4range(7,10)>>int4range(2,5) | true |
&< | 不超过右 | int4range(1,10)&<int4range(7,10) | true |
&> | 不超过左 | int4range(7,10)&>int4range(2,8) | true |
-|- | 相邻 | numrange(2.2,3.3) -|- numrange(3.3,4.4) | true |
+ | 并 | int4range(2,20) + int4range(5,30) | [2,30) |
* | 交 | int4range(2,20) * int4range(5,30) | [5,20) |
- | 差 | int4range(2,20) - int4range(5,30) | [2,5) |
2.2范围函数
函数 |
返回类型 |
描述 |
例子 |
结果 |
lower(anyrange) |
范围的元素类型 |
范围的下界 |
lower(int4range(2,5)) |
2 |
upper(anyrange) |
范围的元素类型 |
范围的上界 |
upper(int4range(2,5)) |
5 |
isempty(anyrange) |
boolean |
范围是否为空 |
isempty(int4range(2,5)) |
false |
lower_inc(anyrange) |
boolean |
上界是否包含在内 |
lower_inc(int4range(2,5)) |
true |
upper_inc(anyrange) |
boolean |
下界是否包含在内 |
upper_inc(int4range(2,5)) |
false |
lower_inf(anyrange) |
boolean |
下界是否无限 |
lower_inf('(,)'::daterange) |
true |
upper_inf(anyrange) |
boolean |
上界是否无限 |
upper_inf('(,)'::daterange) |
true |
range_merge(anyrange, anyrange) |
boolean |
包含两个给定范围的最小范围 |
range_merge('[5,10)'::int4range,'[7,20)'::int4range) |
[5,20) |
3.有边界的范围
每一个非空范围都有两个界限,下界和上界。这些值之间的所有点都被包括在范围内。一个包含界限意味着边界点本身也被包括在范围内,而一个排除边界意味着边界点不被包括在范围内。
在一个范围的文本形式中,一个包含下界被表达为“[”而一个排除下界被表达为“(”。同样,一个包含上界被表达为“]”而一个排除上界被表达为“)”。
函数lower_inc和upper_inc分别测试一个范围值的上下界。
一个范围值的输入必须遵循下列模式之一:
(lower-bound,upper-bound) (lower-bound,upper-bound] [lower-bound,upper-bound) [lower-bound,upper-bound] empty |
4.无边界的范围
一个范围的下界可以被忽略,这意味着所有小于上界的点都被包括在范围中。同样,如果范围的上界被忽略,那么所有比上界大的的都被包括在范围中。如果上下界都被忽略,该元素类型的所有值都被认为在该范围中。
这等效于把下界当作“负无穷”,或者把上界当作“正无穷”。但是注意这些无穷值绝不是范围的元素类型的值,并且绝不是范围的一部分(没有所谓的包含无限界限,因此即使尝试使用,它也将被自动转换成一个排除界限)。
还有,有一些元素类型具有一种“无限”概念。例如,在时间戳范围中,[today,]与[today,)意义相同。但是[today,infinity]与[today,infinity)意义不同,后者排除了特殊的时间戳的值infinity。
函数lower_inf和upper_inf分别测试一个范围的无限上下界。
5.构建范围
每一种范围类型都有一个与其同名的构造器函数。构造器函数接受两个或三个参数。两个参数的形式以标准的形式构造一个范围(下界是包含的,上界是排除的),而三个参数的形式按照第三个参数指定的界限形式构造一个范围。第三个参数必须是下列字符串之一:“()”、 “(]”、 “[)”或者 “[]”。举例说明范围的构建方式:
1) 完整的形式包括下界、上界以及指示界限包含性/排除性的文本参数。
postgres=# select tsrange('2018-10-31 12:00:00','2018-11-11 00:00:00','[]'); tsrange ----------------------------------------------- ["2018-10-31 12:00:00","2018-11-11 00:00:00"] (1 row) |
2) 如果第三个参数被忽略,则默认为“[)”。
postgres=# select numrange(2.5,12.0); numrange ------------ [2.5,12.0) (1 row) |
3) 为一个界限使用null导致范围在该边界是无界的。
postgres=# select numrange(null,3.0); numrange ---------- (,3.0) (1 row) |
更多详细信息请登录【瀚高技术支持平台】查看
https://support.highgo.com/#/index/docContent/6ebb962505b37336