PostgreSQL 数组类型

Posted Ryan.zheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL 数组类型相关的知识,希望对你有一定的参考价值。

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

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

 

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

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

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

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

 

如何输入数组值

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

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

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

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

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

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

 

访问数组

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

CREATE TABLE test02 (id int[]);

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

SELECT id[2], id[3], id[4] FROM test02;

指定上下标的格式为:

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

 

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

SELECT id, col[1:2] 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 数组类型的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 typeorm 在 postgresql 中使用数字数组?

哪个 Ruby ORM 支持 PostgreSQL 数组数据类型?

PostgreSQL PDO 插入数组类型

复合数组类型作为 PostgreSQL 中的 OUTPUT 参数

在 JDBC / PostgreSQL 中使用 SQL 数组类型更新结果集

插入复合类型数组给出错误 postgresql 9.4--