注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL9.2Beta: Add support for range data types  

2012-05-24 16:35:56|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

      PostgreSQL9.2 新增数据类型 Range Type,即范围类型,Range Type 类型的数据可以展现一个范围内的
数据,Range Type 可以是多种类型,包括 integer,timestamp 等,Range type 适用于数值,时间需要展现范
围的场景,接下来演示 Range Type  的初步应用。

 

一 Range Types 类型
1 INT4RANGE — Range of INTEGER
2 INT8RANGE — Range of BIGINT
3 NUMRANGE  — Range of NUMERIC
4 TSRANGE   — Range of TIMESTAMP WITHOUT TIME ZONE
5 TSTZRANGE — Range of TIMESTAMP WITH TIME ZONE
6 DATERANGE — Range of DATE


二 Range Input/Output
(lower-bound,upper-bound)
(lower-bound,upper-bound]
[lower-bound,upper-bound)
[lower-bound,upper-bound]
empty


--2.1 举个例子
(0,100)    不包含0和100,并且包括0到100之间的所有整数
(0,100]    不包含0,包含100,,并且包括0到100之间的所有整数
[0,100)    不包含100,包含0,并且包括0到100之间的所有整数
[0,100]     包括0和100,       并且包括0到100之间的所有整数


三 Range Function

 francs=> select '[1,4]'::int4range;
 int4range
-----------
 [1,5)
(1 row)


--3.1 查询 range 下界
francs=> select lower('[1,4]'::int4range);
 lower
-------
     1
(1 row)


--3.2 查询 range 上界
francs=> select upper('[1,4]'::int4range);
 upper
-------
     5
(1 row)


--3.3 查询 ramnge 数值是否为空
francs=> select isempty('[1,4]'::int4range);
 isempty
---------
 f
(1 row)

   

 

四 应用场景

      接下来演示 int4range 类型,比如创建一张学生成绩等级表,分为四部分, 0-60 不及格,60-80 一般,80-90 良,
90-100 优秀,下面定义这张表。

--4.1 创建测试表

 francs=> create table test_int4range(id integer primary key,grade int4range,remark varchar(32));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_int4range_pkey" for table "test_int4range"
CREATE TABLE
   


--4.2 增加 grade 字段约束

francs=> alter table test_int4range add exclude using gist (grade with &&);
NOTICE:  ALTER TABLE / ADD EXCLUDE will create implicit index "test_int4range_grade_excl" for table "test_int4range"
ALTER TABLE

francs=> \d test_int4range;
       Table "francs.test_int4range"
 Column |         Type          | Modifiers
--------+-----------------------+-----------
 id     | integer               | not null
 grade  | int4range             |
 remark | character varying(32) |
Indexes:
    "test_int4range_pkey" PRIMARY KEY, btree (id)
    "test_int4range_grade_excl" EXCLUDE USING gist (grade WITH &&)


   
--4.3 插入数据   

 francs=> insert into test_int4range values (1,'[0,60)','bad');
INSERT 0 1

francs=> insert into test_int4range values (2,'[60,80)','just so so');
INSERT 0 1

francs=> insert into test_int4range values (3,'[70,80)','just so so');
ERROR:  conflicting key value violates exclusion constraint "test_int4range_grade_excl"
DETAIL:  Key (grade)=([70,80)) conflicts with existing key (grade)=([60,80)).

备注:插入数据有重复,引发 conflicting。

francs=> insert into test_int4range values (3,'[80,90)','good');
INSERT 0 1

francs=> insert into test_int4range values (4,'[90,100)','Excellent');
INSERT 0 1

francs=> select * From test_int4range;
 id |  grade   |   remark  
----+----------+------------
  1 | [0,60)   | bad
  2 | [60,80)  | just so so
  3 | [80,90)  | good
  4 | [90,100) | Excellent
(4 rows)

   


--4.4 查询包括指定元素的记录

 francs=> select * From test_int4range where grade @> 1::int4;
 id | grade  | remark
----+--------+--------
  1 | [0,60) | bad
(1 row)


francs=> select * From test_int4range where grade @> 75::int4;
 id |  grade  |   remark  
----+---------+------------
  2 | [60,80) | just so so
(1 row)

   

五 附: Range type 操作符

Operator Description Example Result
= equal int4range(1,5) = '[1,4]'::int4range t
<> not equal numrange(1.1,2.2) <> numrange(1.1,2.3) t
< less than int4range(1,10) < int4range(2,3) t
> greater than int4range(1,10) > int4range(1,5) t
<= less than or equal numrange(1.1,2.2) <= numrange(1.1,2.2) t
>= greater than or equal numrange(1.1,2.2) >= numrange(1.1,2.0) t
@> contains range int4range(2,4) @> int4range(2,3) t
@> contains element '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp t
<@ range is contained by int4range(2,4) <@ int4range(1,7) t
<@ element is contained by 42 <@ int4range(1,7) f
&& overlap (have points in common) int8range(3,7) && int8range(4,12) t
<< strictly left of int8range(1,10) << int8range(100,110) t
>> strictly right of int8range(50,60) >> int8range(20,30) t
&< does not extend to the right of int8range(1,20) &< int8range(18,20) t
&> does not extend to the left of int8range(7,20) &> int8range(5,10) t
-|- is adjacent to numrange(1.1,2.2) -|- numrange(2.2,3.3) t
+ union numrange(5,15) + numrange(10,20) [5,20)
* intersection int8range(5,15) * int8range(10,20) [10,15)
- difference int8range(5,15) - int8range(10,20) [5,10)

 

 
六 参考
http://www.postgresql.org/docs/9.2/static/rangetypes.html
http://www.postgresql.org/docs/9.2/static/functions-range.html#RANGE-OPERATORS-TABLE

  评论这张
 
阅读(26093)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016