PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型、用户自定义的类型、枚举类型,

以及组合类型。但目前还不支持 domain 类型。

数组类型的定义就是通过在数组元素类型名后面附加中括号 [] 来实现的,中括号中可以给一个长度数字,也可以不给,

定义指定多维数组的维度也是没有意义的,数组的维度是根据实际插入的数据来确定的,如下两个语句意义是一样的:

CREATE TABLE test1 (id int, col1 int[], col2 int[], col3 text[][]);

CREATE TABLE test2 (id int, col1 int[], col2 int[], col3 text[]);

如何输入数组值

可以使用 ARRAY 构造器语法输入数据,一个数组构造器是一个表达式,它从自身的成员上构造一个数组值。

一个简单的数组构造器由关键字 ARRAY、[、一个或多个表示数组元素值的表达式(用逗号分隔)、] 组成

INSERT INTO test values(, ARRAY['os', 'dba']);

INSERT INTO test values(, ARRAY['os"dba', '123"456']);

INSERT INTO test values(, ARRAY['os''dba', '''']);

// 多维数组,在向多维数组插入值时,各个维度的元素个数必须相同,否则会报错
INSERT INTO test values(, ARRAY[['os', 'dba'],['dba', 'os']]);

访问数组

默认情况下,数组的下标是从 1 开始的,但也可以指定下标的开始值,如下:

CREATE TABLE test02 (id int[]);

INSERT INTO test02 values('[2:4] = {1, 2, 3}');

SELECT id[], id[], id[] FROM test02;

指定上下标的格式为:

'[下标:上标] = [元素值1,元素值2,元素值3,...]'

可以使用数组的切片,如下所示:

SELECT id, col[:] FROM test02;

数组的操作符

数组类型支持一些集合关系的操作符,如下所示:

@> 包含

ARRAY[1, 2, 3] @> ARRAY[1, 2]

结果:t

ARRAY[1, 2, 3] @> ARRAY[1, 4]

结果:f

ARRAY[1, 2, 3] @> ARRAY[2, 1]

结果:t

ARRAY[[1, 2, 3]] @> ARRAY[[1, 2], [2, 3]]

结果:t

<@ 被包含于

ARRAY[1, 2] <@ ARRAY[1, 2, 3]

结果:t

ARRAY[2, 1] <@ ARRAY[1, 2, 3]

结果:t

ARRAY[1, 4] <@ ARRAY[1, 2, 3]

结果:t

ARRAY[[1, 2], [2, 4]] <@ ARRAY[1, 2, 3]

结果:f

&& 重叠,是否有共同元素

ARRAY[1, 2, 3] && ARRAY[3, 4]

结果:t

ARRAY[[1, 2], [3, 4]] && ARRAY[4, 5]

结果:t

ARRAY[1, 2] && ARRAY[3, 4]

结果:f

做集合比较时,不管数组中的元素在哪一维,都可以把它们当作集合中的一个元素,而与数组的维度没有关系。

连接操作符 “||”

同维度的数组与数组连接

ARRAY[1, 2] || ARRAY[3, 4]

结果:{1,2,3,4}

ARRAY[1, 2] || ARRAY[2, 3]

结果:{1,2,2,3}

不同维度的数组与数组连接

ARRAY[1, 2] || ARRAY[[3, 4], [5, 6]]

结果:{{1, 2}, {3, 4}, {5, 6}}

元素与数组之间的连接

1 || ARRAY[2, 3]

结果:{1, 2, 3}

ARRAY[2, 3] || 1

结果:{2, 3, 1}

1 || ARRAY[[2, 3]]

结果:报错

数组的函数

array_cat(anyarray, anyarray)

连接两个数组,返回新数组

示例:array_cat(ARRAY[1, 2], ARRAY[3, 4])     结果:{1, 2, 3, 4}

array_cat(ARRAY[[1, 2]], ARRAY[3, 4])   结果:{{1, 2}, {3, 4}}

array_cat(ARRAY[[1, 2]], ARRAY[[3, 4]])   结果:{{1, 2}, {3, 4}}

array_ndims(anyarray)

返回数组的维度,返回值类型为 int

示例:array_ndims(ARRAY[1, 2, 3])  结果:1

array_ndims(ARRAY[[1, 2, 3]])  结果:2

array_ndims(ARRAY[[1, 2, 3], [4, 5, 6]])  结果:2

array_ndims(ARRAY[[[1, 2, 3]]])  结果:3

array_length(anyarray, int)

返回数组指定维度的长度,维度数是有由第二个参数指定的

示例:  array_length(ARRAY[1, 2, 4], 1)  结果:3

array_length(ARRAY[[1, 2], [3, 4], [5, 6]], 1)  结果:3

array_length(ARRAY[[1, 2], [3, 4], [5, 6]], 2)  结果:2

array_lower(anyarray, int)

返回数组的下标

array_upperer(anyarray, int)

返回数组的上标

array_prepend(anyelement, anyarray)

在数组的开头插入一个元素

示例: array_prepend(7, ARRAY[8, 9])   结果:{7, 8, 9}

array_remove(anyarray, anyelement)

移除数组中为指定值的元素,只支持一维数组

示例: array_remove(ARRAY[1, 2, 3], 2)             结果: {1, 3}

array_remove(ARRAY[1, 2, 3, 2, 1, 2], 2)   结果: {1, 3. 1}

array_replace(anyarray, anyelement, anyelement)

把数组中等于指定值元素的值用另一个指定值替代

示例:  array_replace(ARRAY[1, 4, 3], 4, 2)  结果:{1,2,3}

array_to_string(anyarray, text)

使用指定的分隔符(第二个参数) 将数组元素连接为字符串

示例:  array_to_string(ARRAY[1,2,3], ',')  结果:'1,2,3'

string_to_array(text, text)

用指定的分隔符分隔的字符串转成数组

示例:string_to_array('1,2,3', ',')   结果:{1, 2, 3}

unnest(anyarray)

把数组变成多行返回

array_agg(字段)

聚合函数

转发请著名出处:https://www.cnblogs.com/ryanzheng/p/9610182.html

PostgreSQL 数组类型的更多相关文章

  1. PostgreSQL数组类型应用

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

  2. postgresql —— 数组类型

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

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

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

  4. mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler

    mybatis 比 ibatis 改进了很多,特别是支持了注解,支持了plugin inteceptor,也给开发者带来了更多的灵活性,相比其他ORM,我还是挺喜欢mybatis的. 闲言碎语不要讲, ...

  5. java中用spring实现数组类型输出

    java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...

  6. JS数组类型检测

    在强类型语言,数组类型检测是非常容易的事情(typeof就可以解决),而在弱语言JS数据类型就很容易混淆了. JS中常见的数据类型有:number.string.boolean.undefined.f ...

  7. C语言 数组类型与数组指针类型

    //数组类型与数组指针类型 #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ ...

  8. delphi 数组类型与数组指针的巧妙利用

    {本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. ---------------------------------------------- ...

  9. delphi 数组类型

    数组类型 数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素.定义数组时,方括号也用来指定可能的下标值.例如,下面的代码中定义了一个有 24 个整数的数组:type     ...

随机推荐

  1. UVA 11990 ``Dynamic'' Inversion (线段树套BIT,分治)

    题目要求可转化为查询一个区间内有多少数比val大(或者小). 区间用线段树分解(logN),每个区间维护一rank树. rank可用BIT查询,往BIT里面插值,为了保证不同区间的BIT互不影响要先离 ...

  2. Android(java)学习笔记154:采用HttpClient提交数据(qq登录案例)

    1.Apache -Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包 ...

  3. 【洛谷5113】Sabbat of the witch(毒瘤分块)

    点此看题面 大致题意: 给你一个序列,要你支持三种操作:区间赋值,区间求和,撤回之前任一区间赋值操作. 分块 这道题应该是一道十分毒瘤的分块题. 这道题要用到的算法并不是很难,但是思维难度是真的高. ...

  4. 【转】Web实时通信之Socket.IO ,真正的兼容ie

    前面两篇文章使用了Ajax long polling和WebSocket两种常用的Web实时通信方式构建了简单的聊天程序. 但是,由于浏览器的兼容问题,不是所有的环境都可以使用WebSocket这种比 ...

  5. Mybatis-动态 SQL语句

    if标签 判断语句,用户单条件分支判断 where标签 为了简化上面where 1=1的条件拼装,我们可以采用标签来简化开发 同 foreach标签 场景:传入多个 id 查询用户信息 标签用于遍历集 ...

  6. DLM分布式锁的实现机制

    1.AST简介 DLM进程(LMON.LMD)之间的跨实例通信是使用高速互联上的IPC层实现的.为了传递锁资源的状态,DLM使用了异步陷阱(AST),它在操作系统处理程序例程中实现为中断.纯粹主义者可 ...

  7. 01_15_Struts2_带参数的结果集

    01_15_Struts2_带参数的结果集 1. 背景说明 服务器端页面跳转的时候,通过struts提供的标签的valuestack可以直接取.服务器端的转发,valuestack的对象属性可以共享. ...

  8. let和const在es6中的异同点

    let和const这两个都是声明一个变量或函数的方法与var差不太多的效果 let的声明在for循环中,当你定义的是多少,最后你的值就是多少开始的,它只进行一次循环,不会像var那样去一遍一遍的去遍历 ...

  9. selinux详解及配置文件

    selinux详解 selinux 的全称是Security Enhance Linux,就是安全加强的Linux.在Selinux之前root账号能够任意的访问所有文档和服务 : 如果某个文件设为7 ...

  10. JZOJ 5791. 【NOIP2008模拟】阶乘

    5791. [NOIP2008模拟]阶乘 (File IO): input:factorial.in output:factorial.out Time Limits: 1000 ms  Memory ...