`
panzertank
  • 浏览: 16534 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

(转)PostgreSQL 9.2 新特性之:范围类型 (Range Types)

 
阅读更多

 

PostgreSQL 9.2 的一项新特性就是范围类型 range types,通过这个名字你可以轻松猜出该类型的用途,它可让你为某列数据定义数值范围。

这个简单的特性可以让我们不需要定义两个字段来描述数值的开始值和结束值,一个最直观的例子就是:

1 postgres# CREATE TABLE salary_grid (id int, position_name text, start_salary int, end_salary int);
2 CREATE TABLE
3 postgres# INSERT INTO salary_grid VALUES (1, 'junior developper', 20000, 30000);
4 INSERT 0 1
5 postgres# INSERT INTO salary_grid VALUES (2, 'senior developper', 28000, 35000);
6 INSERT 0 1
7 postgres# INSERT INTO salary_grid VALUES (3, 'postgres developper', 50000, 70000);
8 INSERT 0 1

这个简单的关系用于存储一个给定的职位和待遇的范围(你还需要确定工资的货币单位),重要的是你必须实现一些系统函数或者外部程序 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);
02 CREATE TABLE
03 postgres=# INSERT INTO salary_grid VALUES (1, 'junior developper''[20000, 30000]');
04 INSERT 0 1
05 postgres=# INSERT INTO salary_grid VALUES (2, 'senior developper''[28000, 35000]');
06 INSERT 0 1
07 postgres=# INSERT INTO salary_grid VALUES (3, 'postgres developper''[50000, 70000]');
08 INSERT 0 1
09 postgres=# select from salary_grid;
10 id | position_name | salary_range
11 ----+---------------------+---------------
12 1 | junior developper | [20000,30001)
13 2 | senior developper | [28000,35001)
14 3 | postgres developper | [50000,70001)
15 (3 rows)

很重要的一点是,如果使用的是括号(),元组数据的上界是排除在外的,而中括号[]则上界包含其中。

数据库本身也包含不同的用于处理范围类型的函数。

你可直接获取一个给定范围的最低和最高值:

1 postgres=# SELECT upper(salary_range), lower(salary_range) FROM salary_grid;
2 upper lower
3 -------+-------
4 30001 | 20000
5 35001 | 28000
6 70001 | 50000
7 (3 rows)

你可以检查某个值是否包含在给定范围内:

1 postgres=# SELECT salary_range @> 4000 as check
2 postgres=# FROM salary_grid
3 postgres=# WHERE position_name = 'junior developper';
4 check
5 -------
6 f
7 (1 row)

这里显示 4000 并不包含在初级职位的待遇里 [20000,30000].

这里稍微复杂了一些,你还可以检查两个范围之间的重叠的部分,这里的 salary_range 使用的是 int4,因此 int4range 函数可用于此操作:

01 postgres=# WITH junior_salary AS (
02  SELECT salary_range as junior
03  FROM salary_grid
04  WHERE position_name = 'junior developper'),
05 senior_salary AS (
06  SELECT salary_range as senior
07  FROM salary_grid
08  WHERE position_name = 'senior developper')
09 SELECT int4range(junior) && int4range(senior) as check
10  FROM junior_salary, senior_salary;
11 check
12 -------
13 t
14 (1 row)

这里显示的是初级和高级职位之间的工资重叠部分。

你还可以设定无上下限的范围类型,或者是只有上限或者下限的范围类型,让我们来看一个非常现实的例子:

1 postgres# UPDATE salary_grid SET salary_range = '[50000,)' WHERE position_name ='postgres developper';
2 UPDATE 0 1
3 postgres=# SELECT salary_range @> 60000000 as check
4 postgres-# FROM salary_grid WHERE position_name = 'postgres developper';
5 check
6 -------
7 t
8 (1 row)

你可以使用 lower_inf 或者 upper_inf 来检查范围的无限值。

Postgres 还有其他一些内嵌的函数(如 isempty),这个可以直接从官方文档中获取详细信息。

分享到:
评论

相关推荐

    PostgreSql 9.2.24 windows 64位

    PostgreSql 9.2.24 64位 官方版本

    PostgreSQL 9.2 32位dll.rar

    标题 "PostgreSQL 9.2 32位dll.rar" 提供了关于此压缩包的基本信息,它包含的是PostgreSQL数据库系统9.2版本的32位动态链接库(DLL)文件。DLL文件是Windows操作系统中的一种共享库,用于存储程序执行时需要的代码和...

    postgresql-9.2-windows

    postgresql 9.2 64位 windows 版本安装包。

    PostgreSQL中文手册9.2

    PostgreSQL PostgreSQL PostgreSQL学习手册 学习手册 学习手册 (常用数据类型 常用数据类型 常用数据类型 ) 16 一、数值类型: 一、数值类型: 一、数值类型: .16 六、数组: 六、数组: .22 PostgreSQL PostgreSQL...

    ArcGIS10.2配置PostgreSQL9.2 32位dll

    ArcGIS10.2配置PostgreSQL9.2标准教程,PostgreSQL9.2 32位DLL文件,使用教程查看:https://www.cnblogs.com/liweis/p/11775156.html

    postgresql9.2 jdbc驱动

    另外最好用postgresql-9.2-1003.jdbc4.jar这个驱动,我试过用9.3的提示找不到类 否则会出现CLASS NOT FOUND的情况 (3)提醒3 才外那些还在用adt16的童鞋们,升级adt之后 在引用外部jar的时候虽然引用了jar包...

    postgresql9.2杂志中文版 最大化postgresql性能

    "postgresql9.2杂志中文版 最大化postgresql性能" 提供了官方中文资源,旨在帮助用户提升 PostgreSQL 数据库的运行效率。以下是根据标题和描述提炼出的一些关键知识点,以及可能涉及的更深入内容: 1. **性能优化...

    postgresql9.2_64bit

    postgresql9.2,适合ubuntu11,64位,或其他debian

    postgresql9.2安装,连接到arcmap10.2,创建数据库,通过postgis2.18导入数据

    在本教程中,我们将深入探讨如何安装PostgreSQL 9.2数据库系统,将其与ArcMap 10.2集成,并利用PostGIS 2.18扩展进行地理数据的导入。这个过程对于地理信息系统(GIS)的专业人员至关重要,因为它允许他们管理和操作...

    postgresql 9.2.24 32位dll打包下载

    PostgreSQL 9.2.24 32位DLL打包下载是针对ArcGIS 10.2.2用户的一项重要资源,主要用于建立与PostgreSQL 9.2.24数据库的连接,以便创建和管理企业级地理数据库。在ArcGIS环境中,数据库连接是不可或缺的部分,特别是...

    PostgreSQL-9.2.19-windows

    **PostgreSQL 9.2.19 for Windows 知识点详解** PostgreSQL,简称 Postgres,是一款开源的关系型数据库管理系统(RDBMS),由全球众多开发者共同维护,以其高度的稳定性和强大的功能著称。在给定的压缩包 ...

    postgresql-9.2.24-1-windows-x64-binaries.zip

    7. **数据库特性**:PostgreSQL支持事务、并发控制、视图、存储过程、触发器、索引、全文搜索、JSON/JSONB数据类型、GIS支持等高级特性。9.2版本引入了并行查询、改进的统计信息收集等功能。 8. **扩展与社区**:...

    PostgreSQL教程(四):数据类型详解

     下面是PostgreSQL所支持的数值类型的列表和简单说明: 1. 整数类型:  类型smallint、integer和bigint存储各种范围的全部是数字的数,也就是没有小数部分的数字。试图存储超出范围以外的数值将导致一个错误。...

    postgresql-9.2.24-1.el7_5.x86_64

    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-9.2.4-1安装包

    - 如果在安装过程中没有启动服务,可以在服务管理器中找到 "postgresql-x64-9.2" 或 "postgresql-9.2" 服务并手动启动。 - 使用命令行工具 `pg_ctl` 或图形化工具如 pgAdmin 来管理数据库服务,包括启动、停止和...

    postgresql-9.2.24-1-windows-binaries.zip

    首先,让我们了解一下PostgreSQL 9.2.24的主要特性。在这一版本中,PostgreSQL引入了若干增强和性能改进,例如: 1. **并行查询**:9.2版开始引入了对并行查询的支持,允许在特定情况下利用多核处理器进行更快的...

    postgresql-9.2-liunx

    postgresql 9.2 linux 64位版本数据库安装包。

    postgresql-42.2.2.jar+postgresql-9.2-1003.jdbc4.jar

    PostgreSQL是一种开源关系型数据库管理系统(RDBMS),在全球范围内被广泛应用,因其强大的功能、高度的稳定性和良好的社区支持而受到赞誉。标题中提到的"postgresql-42.2.2.jar"和"postgresql-9.2-1003.jdbc4.jar...

    PostgreSQL15的新特性完整介绍

    根据给定的信息,“PostgreSQL 15 的新特性完整介绍”这一标题暗示了文章将详细介绍 PostgreSQL 15 版本中的新功能与改进。PostgreSQL 是一个强大的开源对象关系型数据库系统,以其稳定性、可扩展性和对 SQL 标准的...

Global site tag (gtag.js) - Google Analytics