加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL 数组类型

发布时间:2020-12-13 16:11:20 所属栏目:百科 来源:网络整理
导读:PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型、用户自定义的类型、枚举类型, 以及组合类型。但目前还不支持 domain 类型。 ? 数组类型的定义就是通过在数组元素类型名后面附加发括号 [] 来实现的,发

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,3] @>?ARRAY[1,2]?

结果:t

ARRAY[1,4]?

结果:f

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

结果:t

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

结果:t

?

<@ 被包含于

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

结果:t

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

结果:t

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

结果:t

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

结果:f

?

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

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

结果:t

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

结果:t

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

?结果:f

?

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

?

连接操作符 “||”

同维度的数组与数组连接

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

结果:{1,3,4}

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

结果:{1,3}

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

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

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

元素与数组之间的连接

1 || ARRAY[2,3]

结果:{1,3}

ARRAY[2,3] || 1

结果:{2,1}

1 || ARRAY[[2,3]]

结果:报错

?

数组的函数

array_cat(anyarray,anyarray)

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

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

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

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

?

array_ndims(anyarray)

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

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

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

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

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

?

array_length(anyarray,int)

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

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

? ? ? ? ? ?array_length(ARRAY[[1,[3,6]], 1)? 结果:3

? ? ? ? ? ?array_length(ARRAY[[1,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)? ? ? ? ? ? ?结果: {1,3}

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

?

array_replace(anyarray,anyelement,anyelement)

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

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

?

array_to_string(anyarray,text)

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

示例:? array_to_string(ARRAY[1,‘,‘)? 结果:‘1,3‘

?

string_to_array(text,text)

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

示例:string_to_array(‘1,3‘,‘)? ?结果:{1,3}

?

unnest(anyarray)

把数组变成多行返回

?

array_agg(字段)

聚合函数

?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读