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(字段)
聚合函数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。