范围类型

目录

文档用途

详细信息

相关文档

文档用途

范围类型是表达某种元素类型的一个值的范围的数据类型。

范围类型非常有用,因为它们可以表达一种单一范围值中的多个元素值,并且可以很清晰地表达诸如范围重叠等概念。例如,范围类型可以用于表示时间和日期范围。

详细信息

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

猜你喜欢

转载自blog.csdn.net/pg_hgdb/article/details/84861602