PostgreSQL 9.2 的一项新特性就是范围类型 range types,通过这个名字你可以轻松猜出该类型的用途,它可让你为某列数据定义数值范围。
这个简单的特性可以让我们不需要定义两个字段来描述数值的开始值和结束值,一个最直观的例子就是:
1 |
postgres# CREATE TABLE salary_grid (id int , position_name text, start_salary int , end_salary int );
|
3 |
postgres# INSERT INTO salary_grid VALUES (1, 'junior developper' , 20000, 30000);
|
5 |
postgres# INSERT INTO salary_grid VALUES (2, 'senior developper' , 28000, 35000);
|
7 |
postgres# INSERT INTO salary_grid VALUES (3, 'postgres developper' , 50000, 70000);
|
这个简单的关系用于存储一个给定的职位和待遇的范围(你还需要确定工资的货币单位),重要的是你必须实现一些系统函数或者外部程序 API 来执行例如范围的交叉或者联合。
Postgres 9.2 允许你的应用直接在数据库端实现范围值,范围类型包括:
- 4 位整数范围, int4range
- 8 位整数范围, int8range
- 数值范围, numrange
- 无时区的时间戳范围, tsrange
- 带时间戳的时间范围, tstzrange
- 日期范围, daterange
你也可以定义自己的范围类型,Postgre 官网文档给出了 float 的示例:
1 |
postgres# CREATE TYPE floatrange AS RANGE (
|
2 |
postgres# subtype = float8, |
3 |
postgres# subtype_diff = float8mi); |
有了这样一个功能,我们前面提到的工资表格例子就可以改为:
01 |
postgres=# create table salary_grid (id int , position_name text, salary_range int4range);
|
03 |
postgres=# INSERT INTO salary_grid VALUES (1, 'junior developper' , '[20000, 30000]' );
|
05 |
postgres=# INSERT INTO salary_grid VALUES (2, 'senior developper' , '[28000, 35000]' );
|
07 |
postgres=# INSERT INTO salary_grid VALUES (3, 'postgres developper' , '[50000, 70000]' );
|
09 |
postgres=# select * from salary_grid;
|
10 |
id | position_name | salary_range |
12 |
1 | junior developper | [20000,30001) |
13 |
2 | senior developper | [28000,35001) |
14 |
3 | postgres developper | [50000,70001) |
很重要的一点是,如果使用的是括号(),元组数据的上界是排除在外的,而中括号[]则上界包含其中。
数据库本身也包含不同的用于处理范围类型的函数。
你可直接获取一个给定范围的最低和最高值:
1 |
postgres=# SELECT upper (salary_range), lower (salary_range) FROM salary_grid;
|
你可以检查某个值是否包含在给定范围内:
1 |
postgres=# SELECT salary_range @> 4000 as check
|
2 |
postgres=# FROM salary_grid
|
3 |
postgres=# WHERE position_name = 'junior developper' ;
|
这里显示 4000 并不包含在初级职位的待遇里 [20000,30000].
这里稍微复杂了一些,你还可以检查两个范围之间的重叠的部分,这里的 salary_range 使用的是 int4,因此 int4range 函数可用于此操作:
01 |
postgres=# WITH junior_salary AS (
|
02 |
SELECT salary_range as junior
|
04 |
WHERE position_name = 'junior developper' ),
|
06 |
SELECT salary_range as senior
|
08 |
WHERE position_name = 'senior developper' )
|
09 |
SELECT int4range(junior) && int4range(senior) as check
|
10 |
FROM junior_salary, senior_salary;
|
这里显示的是初级和高级职位之间的工资重叠部分。
你还可以设定无上下限的范围类型,或者是只有上限或者下限的范围类型,让我们来看一个非常现实的例子:
1 |
postgres# UPDATE salary_grid SET salary_range = '[50000,)' WHERE position_name = 'postgres developper' ;
|
3 |
postgres=# SELECT salary_range @> 60000000 as check
|
4 |
postgres-# FROM salary_grid WHERE position_name = 'postgres developper' ;
|
你可以使用 lower_inf 或者 upper_inf 来检查范围的无限值。
Postgres 还有其他一些内嵌的函数(如 isempty),这个可以直接从官方文档中获取详细信息。
分享到:
相关推荐
postgresql 9.2 64位 windows 版本安装包。
ArcGIS10.2配置PostgreSQL9.2标准教程,PostgreSQL9.2 32位DLL文件,使用教程查看:https://www.cnblogs.com/liweis/p/11775156.html
从postgresql-9.2.24-1-windows-binaries中提取,包含ArcGIS所需的5个dll文件。
PostgreSql 9.2.24 64位 官方版本
另外最好用postgresql-9.2-1003.jdbc4.jar这个驱动,我试过用9.3的提示找不到类 否则会出现CLASS NOT FOUND的情况 (3)提醒3 才外那些还在用adt16的童鞋们,升级adt之后 在引用外部jar的时候虽然引用了jar包...
postgresql9.2,适合ubuntu11,64位,或其他debian
PostgreSQL PostgreSQL PostgreSQL学习手册 学习手册 学习手册 (常用数据类型 常用数据类型 常用数据类型 ) 16 一、数值类型: 一、数值类型: 一、数值类型: .16 六、数组: 六、数组: .22 PostgreSQL PostgreSQL...
postgresql 官方中文杂志 怎么最大化postgresql性能 第0期,优化postgresql性能 第1期 postgresql 9.1 发布
postgresql-9.2.24-1.el7_5.x86_64,postgresql-libs-9.2.24-1.el7_5.x86_64.rpm,postgresql-devel-9.2.24-1.el7_5.x86_64.rpm
下面是PostgreSQL所支持的数值类型的列表和简单说明: 1. 整数类型: 类型smallint、integer和bigint存储各种范围的全部是数字的数,也就是没有小数部分的数字。试图存储超出范围以外的数值将导致一个错误。...
《PostgreSQL修炼之道:从小工到专家》的主要内容和特色: 全面且实践性强:本书从SQL基础、安装配置、数据类型、数据库的逻辑结构等基础知识一直讲到PostgreSQL的架构、技术内幕、特色功能、Standby、数据库优化...
postgresql 9.2 linux 64位版本数据库安装包。
arcgis 10.2.2 连接postgresql 9.2.24创建企业级地理数据库所需要postgresql dll;
postgresql9.2安装,连接到arcmap10.2,创建数据库,通过postgis2.18导入数据;包含安装包,可用dll文件,说明文件。
postgresql-42.2.2.jar和postgresql-9.2-1003.jdbc4.jar两个jar包放一起了,有需要的朋友可以下载
ArcGIS 10.2 支持版本 ,PostgreSQL-9.2.19-1-windows
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
在ArcGIS10.2+postgresql9.2中创建地理空间库的需要用到的工具和动态库