Range & 复合类型


--pg支持范围类型
? int4range — Range of integer
? int8range — Range of bigint
? numrange — Range of numeric
? tsrange — Range of timestamp without time zone
? tstzrange — Range of timestamp with time zone
? daterange — Range of date

--范围时间戳
CREATE TABLE reservation (room int, during tsrange);
--插入范围内时间
INSERT INTO reservation VALUES
(1108, '[2010-01-01 14:30, 2010-01-01 15:30)');
 --正无空大,负无穷小 -infinity 代表无穷小
 INSERT INTO reservation VALUES
(1109, '[2010-01-01 14:30,"infinity" )'),(1110, '["-infinity",2010-01-01 14:30)');
postgres=# select * from reservation ;
 room |                    during
------+-----------------------------------------------
 1108 | ["2010-01-01 14:30:00","2010-01-01 15:30:00")
 1109 | ["2010-01-01 14:30:00",infinity)
 1110 | [-infinity,"2010-01-01 14:30:00")

 -- Containment 范围内是否包含某一个值
SELECT int4range(10, 20) @> 3;
-- Overlaps 两个范围是否有重叠
SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);

-- Extract the upper bound 求范围的上限
SELECT upper(int8range(15, 25));

-- Is the range empty? 判断范围是否为空
SELECT isempty(numrange(1, 5));

--每个范围类型都有一个与对应的构造函数,注意第三个参数说明其是全包围还是半包围
postgres=# SELECT int8range(1, 14, '(]');
 int8range
-----------
 [2,15)
postgres=# SELECT numrange(NULL, 2.2);
 numrange
----------
 (,2.2)

-- 类似购物卷包含在有效期
 postgres=# select '[2016-06-01,2016-07-01)'::daterange @> '[2016-06-18,2016-06-18]'::daterange;
 ?column?
----------
 t
(1 row)
postgres=# select '[2016-06-01,2016-07-01)'::daterange @> '[2016-06-18,2016-07-18]'::daterange;
 ?column?
----------
 f

--指定下限,但上限无穷
postgres=# select '[2016-06-01,)'::daterange @> '[2016-06-18,2016-07-18]'::daterange;
 ?column?
----------
 t

-- Extract the upper bound 求范围的上限
postgres=# SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);
 ?column?
----------
 t
(1 row)

-- Compute the intersection 求两个范围的交集
postgres=# SELECT int4range(10, 20) * int4range(15, 25);
 ?column?
----------
 [15,20)
(1 row)

postgres=# SELECT int4range(10, 20) - int4range(15, 25);
 ?column?
----------
 [10,15)
(1 row)

postgres=# SELECT int4range(10, 20) + int4range(15, 25);
 ?column?
----------
 [10,25)
(1 row)

--创建索引
CREATE INDEX reservation_idx ON reservation USING GIST (during);

--pg支持复合类型,注意创建复合类型时 as 不能省略
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);

CREATE TABLE on_hand (
item inventory_item,
count integer
);
--注意此时的""和null是不一样的
insert into on_hand values('("rudy gao",11,12)' ,1),('("",11,12)' ,2),('(,11,12)' ,3);
insert into on_hand values(row("rudy gao",11,12)) ,4);
--选取name属性为null的值,注意小括号
postgres=# select * from on_hand where (item).name is null;
   item   | count
----------+-------
 (,11,12) |     3
(1 row)
--选取name属性为空值,对于空值要去掉其中双引号
postgres=# select * from on_hand where (item).name = '""';
 item | count
------+-------
(0 rows)
--选取name属性为空值
postgres=# select * from on_hand where (item).name = '';
    item    | count
------------+-------
 ("",11,12) |     2

 --更新复和类型数据值,注意set的左边不能加括号
 update on_hand set item.price=(item).price+1;
时间: 2024-08-31 04:50:06

Range & 复合类型的相关文章

Go语言中的复合类型详细介绍_Golang

golang复合类型包括:结构体.数组.切片.Maps. 1.数组 数组 golang中的数组与C语言中的数组差异很大,倒更类似Pascal中的数组. (Slice,下个话题,有些像C语言中的数组) 复制代码 代码如下: var ar [3]int 声明ar为一个拥有三个整型数的数组,所有元素初始化为0. 大小是类型的一个组成部分. 内置的函数len可以用于获取数组大小: 复制代码 代码如下: len(ar) = 3 数组是值类型 golang中的数组是值,而非C语言中的隐式指针.你可以获得数组

WebService大讲堂之Axis2(2):复合类型数据的传递

在实际的应用中,不仅需要使用WebService来传递简单类型的数据,有时也需要传递更复杂的数据, 这些数据可以被称为复合类型的数据.数组与类(接口)是比较常用的复合类型.在Axis2中可以直接使 用将WebService方法的参数或返回值类型声明成数组或类(接口).但要注意,在定义数组类型时只能使 用一维数组,如果想传递多维数组,可以使用分隔符进行分隔,如下面的代码所示: String[] strArray = new String[]{ "自行车,飞机,火箭","中国,美

oracle复合类型-oracle 存储过程 返回复合数据类型(index by表) ibatis如何接受

问题描述 oracle 存储过程 返回复合数据类型(index by表) ibatis如何接受 最近有个问题一直困扰着,希望各位能给予帮助. 先贴代码: 1 2 3 jdbcType="Object" mode="IN" /> 4 5 jdbcType="ARRAY" mode="OUT" typeHandler="com.diy.object.entity.ObjectTypeHandler" /&

C++ 中const和复合类型_C 语言

1.const和引用 可以把引用绑定在常量上,称之为,对常量的引用.不能对那个引用赋值. 如: const int ci = 1024; const int &ri = ci; 解读:ri是对ci的引用.ri的const意思是视ci为变量. 对于常量,只能使用"对常量的引用"这个引用方式 int &ri = ci;是错误的,因为ci不能赋值,但是可能会对ri赋值从而影响const限定. 所以,他们(制定标准的人)创造了 对常量的引用 的 引用方式. 下面高能!!! 上面

Greenplum 自定义复合类型 数组

标签 PostgreSQL , Greenplum , composite type array 背景 如果你现在要在Greenplum中创建一个复合类型,是不会自动给你创建对应的数组类型的.(而实际上PostgreSQL 在2007年已经支持了这个功能) Greenplum需要等到5.0,才能使用上它了. https://github.com/greenplum-db/gpdb/commit/8954a537ee6199a80c38581fd3cd7ed463abbdea Support ar

C++ 复合类型学习笔记

复合类型是基于整形和浮点型创建的.影响最为深远的复合类型是类. 1.数组 数组是一种数据格式,能够存储多个同类型的值. typeName arrayName[arraySize] int months[12] = {1, 2, 3};其他元素将设置为0 char name[4] = {'p', 'i', 'g', '\0'}; 不能将一个数组赋值给另一个数组. 2.字符串 存储在内存的连续字节中的一系列字符.C++处理字符串的方式有两种.一种来自C语言,常被称为C-风格字符串,另一种基于stri

CXF处理javaBean等复合类型以及Map等复杂类型的数据

在实际中除了传入一些基本的参数以外,还需要传入一些类似于javaBean等复合类型,或者Map等复杂类型的数据,这一篇博文主要来写两个demo,模拟一下CXF处理这类数据的过程. 1. CXF处理javaBean等复合类型的数据 客户端提交一个数据过去,要检查权限,比如是管理员的话,就拥有多个权限,普通用户可能就一个权限之类的.这样的话需要一个用户的bean和权限的bean,然后数据库的数据我用List来模拟一下,demo如下: public class User {     private I

dataset如何生成多层复合类型的xml

问题描述 dataSet1.ReadXmlSchema(@"D:/xml/Info.xsd");//info.xsd包含多层complextype想通过修改dataset1的内容,完成xml的修改.dataSet1.WriteXml(@"D:/xml/FX.xml",XmlWriteMode.IgnoreSchema);写完后发现xml文件里不是按照XSD的结构生成的,都是并列关系的.不知道怎么解决,还请高手帮忙,谢谢!xsd定义类似下边:<xs:elemen

xsd仅含文本复合类型

问题描述 <xs:elementname="shoesize"><xs:complexType><xs:simpleContent><xs:extensionbase="xs:integer"><xs:attributename="country"type="xs:string"/></xs:extension></xs:simpleContent&