postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。日常中使用数组类型的机会不多,但还是可以了解一下。不像C或JAVA高级语言的数组下标从0开始,postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。且postgresql既支持一维数组,也支持多维数组,但是平时二维数组也就够用了。

示例1.使用ARRAY构建数组类型

---1*4的一维数组
test=# select array[1,2,3,4];
array
-----------
{1,2,3,4}
(1 row) --2*2的二维数组
test=# select array[[1,2],[3,4]];
array
---------------
{{1,2},{3,4}}
(1 row)
--1*2的二维数组,基本类型为box矩形类型,且和上面相比box类型元素之间是以分号分隔的,其他所有类型的数据都是以逗号分隔的
test=# select array[box'(1,1),(0,0)',box'(0,0),(-1,-1)'];
array
-----------------------------
{(1,1),(0,0);(0,0),(-1,-1)}
(1 row)

示例2.创建一张表,字段包含数组类型

其中int[]表示数组长度无限制,int[4]表示数组长度为4.

test=# create table tbl_array(a int[],b varchar(32)[][],c int);
CREATE TABLE
test=# insert into tbl_array (a,b,c) values (array[1,2],array[[1,2,3],[4,5,6]],1);
INSERT 0 1
test=# insert into tbl_array (a,b,c) values (array[1,2,3],array[[1,2],[4,5]],2);
INSERT 0 1
test=# select * from tbl_array ;
a | b | c
---------+-------------------+---
{1,2} | {{1,2,3},{4,5,6}} | 1
{1,2,3} | {{1,2},{4,5}} | 2
(2 rows) test=# select a[],b[] from tbl_array where c = 1;
a | b
---+---
1 |
(1 row) test=# select a[],b[][] from tbl_array where c = 1;
a | b
---+---
1 | 4
(1 row) test=# select a[],b[][] from tbl_array where c = 1;
a | b
---+---
1 |
(1 row)
test=# update tbl_array set a[] = 200 where a[] = 1;
UPDATE 1
test=# select a[],b[][] from tbl_array ;
a | b
-----+---
100 |
200 |
(2 rows)

也可以使用[下标:上标]方式来查询数组连续的某些元素。

test=# select a[2:3] from tbl_array ;
a
-------
{2}
{2,3}
(2 rows) test=# select a[1:3] from tbl_array ;
a
-----------
{100,2}
{200,2,3}
(2 rows)

数组操作符与函数

操作符

操作符 描述 示例 结果
= 相等  SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3];  t
<> 不等于  select ARRAY[1,2,3] <> ARRAY[1,2,4];  t
< 小于  select ARRAY[1,2,3] < ARRAY[1,2,4];  t
> 大于  select ARRAY[1,4,3] > ARRAY[1,2,4];  t
<= 小于或等于  select ARRAY[1,2,3] <= ARRAY[1,2,3];  t
>= 大于或等于  select ARRAY[1,4,3] >= ARRAY[1,4,3];  t
@> 包含  select ARRAY[1,4,3] @> ARRAY[3,1];  t
<@ 包含于  select ARRAY[2,7] <@ ARRAY[1,7,4,2,6];  t
&& 重叠(是否有相同元素)  select ARRAY[1,4,3] && ARRAY[2,1];  t
|| 数组与数组连接  select ARRAY[1,2,3] || ARRAY[4,5,6];  {1,2,3,4,5,6}
|| 数组与数组连接  select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]];  {{1,2,3},{4,5,6},{7,8,9}}
|| 元素与数组连接  select 3 || ARRAY[4,5,6];  {3,4,5,6}
|| 数组与元素连接  select ARRAY[4,5,6] || 7;  {4,5,6,7}

函数

函数 返回类型 描述 示例 结果
array_append(anyarray,anyelement) anyarray  在数组末尾追加元素

SELECT array_append(ARRAY[1,2], 3);

 {1,2,3}
array_cat(anyarray,anyarray) anyarray  连接两个数组  SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]);  {1,2,3,4,5}
array_ndims(anyarray) int  返回数组维数  SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]);  2
array_dims(anyarray) text  返回数组维数的文本表示  SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]);  [1:2][1:3]
array_fill(anyelement,int[], [, int[]]) anyarray 使用提供的值和维度初始化一个数组,其中anyelement是值,第一个int[]是数组的长度,第二个int[]是数组下界,下界默认是1  SELECT array_fill(7, ARRAY[3], ARRAY[2]);  [2:4]={7,7,7}
array_length(anyarray,int) int  返回数组指定维度的长度  SELECT array_length(array[1,2,3], 1);  3
array_lower(anyarray,int) int  返回数组指定维度的下界  SELECT array_lower('[0:2]={1,2,3}'::int[], 1);  0
array_position(anyarray,anyelement [, int]) int  返回数组元素anyelement从数组的[,int]位置(默认为1)开始第一次出现在数组中的位置,数组必须是一维的  SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');  2
array_positions(anyarray,anyelement) int[]  返回元素在数组中的所有位置  SELECT array_positions(ARRAY['A','A','B','A'], 'A');  {1,2,4}
array_prepend(anyelement,anyarray) anyarray  在数组开头添加新的元素  SELECT array_prepend(1, ARRAY[2,3]);  {1,2,3}
array_remove(anyarray,anyelement) anyarray  从数组中删除所有的指定元素,必须是一维数组  SELECT array_remove(ARRAY[1,2,3,2], 2);  {1,3}
array_replace(anyarray,anyelementanyelement) anyarray  替换指定数组元素为新的元素  SELECT array_replace(ARRAY[1,2,5,4], 5, 3);  {1,2,3,4}
array_to_string(anyarray,text [, text]) text  将数组元素使用分隔符连接为文本,NULL可以使用指定元素替换  SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*');  1,2,3,*,5
array_upper(anyarray,int) int  数组指定维度的上届  SELECT array_upper(ARRAY[1,8,3,7], 1);  4
cardinality(anyarray) int  返回数组所有维度的长度总和,如果是空数组则返回0  SELECT cardinality(ARRAY[[1,2],[3,4]]);  4
string_to_array(text,text [, text]) text[]  将文本使用分隔符分隔后转换为数组,如果指定第三个参数,则第三个参数在数组中被转换为NULL  SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy');  {xx,NULL,zz}
unnest(anyarray) setof anyelement  将数组元素转换为行  SELECT unnest(ARRAY[1,2]);

1
2

unnest(anyarrayanyarray[, ...]) setof anyelement, anyelement [, ...]  将多维数组转换为行集合,其中第一个数组显示为第一列,第二个数组显示为第二列,以此类推。但是这个函数只在from子句中使用  SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);

unnest | unnest
--------+----
1 | foo
2 | bar
  | baz

postgresql----数组类型和函数的更多相关文章

  1. C++数组类型与函数类型

    之所以将C++的数组类型与函数类型拿到一块说,是因为两者在很多地方都一样. 首先,声明形式上类似: 数组类型:  type [num]                                 ...

  2. PostgreSQL 数组类型

    PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...

  3. 测试常用shell语句——数值,数组类型;函数创建

    一.特殊类型的变量 shell下默认的变量类型为字符串类型 1,数值类型 如果进行数值运算,有这么几种方法 方法一: declare -i sum sum=+ echo $sum 方法二: sum=$ ...

  4. PostgreSQL数组类型应用

    在使用 awk 脚本:数组是一大利器:在很多场景是用数组能处理. 在 python 中,数据类型list:相当于array类型. 在 Oracle 中,对 array 不够友好,感觉像是鸡肋.但是在 ...

  5. postgresql —— 数组类型

    创建数组 CREATE TABLE sal_emp ( name text, pay_by_quarter integer[] --还可以定义为integer[4]或integer ARRAY[4] ...

  6. PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】

    前言 PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等数据类型,还支持 int4[]/int8[] ...

  7. FCL源码中数组类型的学习及排序函数Sort函数的分析

    Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点    能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...

  8. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:    常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:    下面是Post ...

  9. JavaScript数组类型

    特点 动态长度 一个数组里面的元素可以是不同类型 数组的length属性不是只读属性,可通过length延长数组也可以删减数组的长度 定义数组两种方法 //方法一: var names = new A ...

随机推荐

  1. 【转】微信公众开发URL和token填写详解

    很多人不明白微信公众号开发者中心服务器配置里面的url和token是什么,不会填写.看了教程也不理解是什么,本文详述一下这个问题. 第一步:作为一名微信公众号开发者,别人进入你的微信公众号,肯定会看见 ...

  2. 一下删除MSSQL表所有的数据,但不删除表结构

    --CREATE PROCEDURE sp_DeleteAllData--AS--EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT AL ...

  3. war内部结构

    war index.html(非必须) WEB-INF classes (java编译之后的class文件) lib(jar文件) web.xml(war包描述文件) subdirectories[可 ...

  4. css后台页面布局技巧

    目标: 实现左边侧边栏固定,右边内容区自适应 侧边栏内容较少时背景100%高度展示 侧边栏内容较多时可以滚动,且不让显示滚动条(显示太丑) 内容区较少时不出现滚动条,较多时可以滚动 code: < ...

  5. 使用 requests 访问 HTTPS

    当我们访问 HTTPS 的网站时,需要进行证书验证,在浏览器中可以自动处理验证问题,在 Python 中有以下两种做法: import requests //不进行证书验证,但这种方式会出现警告,如下 ...

  6. Excel导出到浏览器(个人备份)

    /// <summary>  /// Excel导出  /// </summary>  /// <param name="dt"></pa ...

  7. Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    转自:http://blog.csdn.net/iamdll/article/details/20998035 分类: 分布式 2014-03-11 10:31 156人阅读 评论(0) 收藏 举报 ...

  8. gitlab数据迁移

    由于gitlab是默认安装的,随着公司代码越来越多,导致gitlab数据目录空间不足,出现无法访问gitlab了. 磁盘空间: /home有1.8T的空间一直没用上! 现在打算将原有代码目录迁移到新目 ...

  9. GDI+ gif文件的显示和格式转换

    GDI+ gif文件的显示和格式转换   gdi+imagedeletenulltiff GDI+ gif文件的显示和格式转换 怎么获取gif文件的每一帧,并且显示出来呢? 1.怎么用gid+显示gi ...

  10. mysql学习笔记(三)

    -- 主键冲突(duplicate key) ,'xujian','anhui'); ,'xiewei','anhui'); ,'luyang','anhui');-- 主键冲突了 -- 可以选择性的 ...