PostgreSQL数据类型——范围类型

PostgreSQL数据类型——范围类型

实际工作中并不是所有业务都会使用这些类型,但是在查询数据过程中过滤某些数据的时候,我们可以将一些条件,转换成这些特殊的数据格式,通过这些数据格式对应的函数,来实现一些复杂条件才能实现的过滤。

版本为9.6版本

在PostgreSQL中目前支持六种区间范围

类型说明
int4rangeinteger范围类型
int8rangebigint范围类型
numrangenumeric范围类型
tsrange不带时区的timestamp范围类型
tstzrange带时区的timestamp范围类型
daterangedate范围类型

定义范围类型

将一个字段设置为数组类型只需要在其基本类型后添加[]即可。

create table test_rang (
	id integer,
	rang_int int4range,
	rang_date daterange
)

如何插入范围类型数据

插入数据时[ 表示包含下界,(表示不包含下界 ,]表示包含上界,)不包含上界。需要注意即使设置了包含上界,但是在最终依然会显示为 )。这是范围类型的标准的边界模式。

INSERT INTO public.test_rang
(id, rang_int, rang_date)
VALUES(2, '[1,3]', '["2022/10/01","2022/11/01"]');
## 插入内容
2	[1,4)	[2022-10-01,2022-11-02)



INSERT INTO public.test_rang
(id, rang_int, rang_date)
VALUES(3, '(1,3)', '("2022/10/01","2022/11/01")');
## 插入内容
3	[2,3)	[2022-10-02,2022-11-01)

插入一个开放的范围

如果我们在设置数据的时候只设置其中一个参数,我们会得到一个没有无边界的范围数据

INSERT INTO public.test_rang
(id, rang_int, rang_date)
VALUES(1, '[1,]', '["2022/10/01",]');
## 插入内容
1	[2,)	[2022-10-02,)



INSERT INTO public.test_rang
(id, rang_int, rang_date)
VALUES(2, '(,3)', '(,"2022/11/01")');
## 插入内容
2	(,3)	(,2022-11-01)

范围类型的操作符

操作符描述例子结果
=等于int4range(1,5) = '[1,4]'::int4rangetrue
<>不等于numrange(1.1,2.2) <> numrange(1.1,2.3)true
<小于int4range(1,10) < int4range(2,3)true
>大于int4range(1,10) > int4range(1,5)true
<=小于或等于numrange(1.1,2.2) <= numrange(1.1,2.2)true
>=大于或等于numrange(1.1,2.2) >= numrange(1.1,2.0)true
@>包含范围int4range(2,4) @> int4range(2,3)true
@>包含元素'[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamptrue
<@范围包含于int4range(2,4) <@ int4range(1,7)true
<@元素包含于42 <@ int4range(1,7)false
&&重叠 (有共同点)int8range(3,7) && int8range(4,12)true
<<严格在左int8range(1,10) << int8range(100,110)true
>>严格在右int8range(50,60) >> int8range(20,30)true
&<没有延伸到右边int8range(1,20) &< int8range(18,20)true
&>没有延伸到左边int8range(7,20) &> int8range(5,10)true
- | -相邻numrange(1.1,2.2) -|- numrange(2.2,3.3)`true
+并集numrange(5,15) + numrange(10,20)[5,20)
*交集int8range(5,15) * int8range(10,20)[10,15)
-差集int8range(5,15) - int8range(10,20)[5,10)

范围相关函数

转换

将普通数据转换为范围数据有两种方式。

  1. 将转换目标的类型格式用()将数据包括起来,类似这样int8range(1,10)
  2. 使用:: 对数据进行转换,类似这样'(1,10)'::int8range,但是需要注意此时()标识的数据无上下边界
## 使用这种模式最终输出的是包含1的下界
select int8range(1,10)
获取结果 [1,10)

select '(1,10)'::int8range
获取结果 [2,10)

结果获取

这部分函数是用来获取范围数据中的某些值的内容。

函数返回类型描述示例结果
lower(anyrange)范围元素类型范围的下界lower(numrange(1.1,2.2))1.1
upper(anyrange)范围元素类型范围的上界upper(numrange(1.1,2.2))2.2

对于无边界的数据它获取的内容为NULL

## 获取的结果
select id,lower(rang_int),lower(rang_date) from test_rang
1	2	2022-10-02
2	NULL NULL	

select id,upper(rang_int),upper(rang_date) from test_rang
1	NULL NULL	
2	3	2022-11-01

值判断

这部分函数用来对范围数据进行一个判断用来获取范围数据是否符合一些规定。但是实际工作用其不仅仅是用来进行范围数据的判断,我们可以将SQL查询出来的内容转换成范围数据进行函数判断,通过这样可以对普通的数据进行一些范围数据才有的操作。

函数返回类型描述示例结果
isempty(anyrange)boolean范围是空的isempty(numrange(1.1,2.2))false
lower_inc(anyrange)boolean包涵下界lower_inc(numrange(1.1,2.2))true
upper_inc(anyrange)boolean包含上界upper_inc(numrange(1.1,2.2))false
lower_inf(anyrange)boolean下界无穷lower_inf('(,"2022/11/01")'::daterange)true
upper_inf(anyrange)boolean上界无穷upper_inf('("2022/11/01",)'::daterange)tru
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大·风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值