Postgresql支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型、用户自定义的类型、枚举类型以及组合类型。
在创建表时,字段类型后面加方括号 “[ ]” 即可定义数组数据类型,例如:
postgres=> create table test04(
id int primary key,
name_arr text[],
len_arr int[]);
CREATE TABLE
以上text[]表示一堆text类型数组。int[]表示一堆int类型数组。
数组类型的插入有两种方式,第一种使用花括号方式:
postgres=> insert into test04 values (1,'{"bei","jing","shi"}','{3,4,3}');
INSERT 0 1
postgres=> select * from test04;
id | name_arr | age_arr
----+----------------+---------
1 | {bei,jing,shi} | {3,4,3}
(1 row)
数组元素放在花括号中,一般用逗号隔开,对于字符类型值要用双引号引用,整个花括号元素用单引号引用。
第二用方式是用关键字 array,例如:
postgres=> insert into test04 values (2,array['Lu','zhi','shen'],array[2,3,4]);
INSERT 0 1
postgres=> select * from test04;
id | name_arr | age_arr
----+----------------+---------
1 | {bei,jing,shi} | {3,4,3}
2 | {Lu,zhi,shen} | {2,3,4}
(2 rows)
如果查询数组所有元素,那么直接查询字段值即可:
postgres=> select * from test04;
id | name_arr | len_arr
----+----------------+---------
1 | {zhang,ya,hui} | {5,2,3}
2 | {Lu,zhi,shen} | {2,3,4}
(2 rows)
如果需要查询数组类型字段中某个位置的元素,可以通过方括号 “[]” 的方式,通过元素下标来查询,下标从1开始:
postgres=> select name_arr[2],len_arr[2] from test04;
name_arr | len_arr
----------+---------
ya | 2
zhi | 3
(2 rows)
1.追加,数组元素的桌架可通过使用函数array_append来进行:
postgres=> update test04 set name_arr=array_append(name_arr,'beizhu');
UPDATE 2
postgres=> select * from test04;
id | name_arr | len_arr
----+-----------------------+---------
1 | {zhang,ya,hui,beizhu} | {5,2,3}
2 | {Lu,zhi,shen,beizhu} | {2,3,4}
(2 rows)
postgres=> update test04 set len_arr=array_append(len_arr,6);
UPDATE 2
postgres=> select * from test04;
id | name_arr | len_arr
----+-----------------------+-----------
1 | {zhang,ya,hui,beizhu} | {5,2,3,6}
2 | {Lu,zhi,shen,beizhu} | {2,3,4,6}
(2 rows)
函数array_append函数会在数组末尾段追加一个指定的元素。
2.删除,使用函数array_remove对数组类型的字段里元素进行删除:
postgres=> update test04 set name_arr = array_remove(name_arr,'beizhu') where id=1;
UPDATE 1
postgres=> select * from test04;
id | name_arr | len_arr
----+----------------------+-----------
2 | {Lu,zhi,shen,beizhu} | {2,3,4,6}
1 | {zhang,ya,hui} | {5,2,3,6}
(2 rows)
函数array_remove通过指定元素进行删除。如果指定的值在数组中有多个,会全部删除符合的元素。
3.更新。数组中的元素想要修改可以通过指定要修改的元素的下标的方式修改:
postgres=> select * from test04 where id=2;
id | name_arr | len_arr
----+----------------------+-----------
2 | {Lu,zhi,shen,beizhu} | {2,3,4,6}
(2 rows)
postgres=> update test04 set name_arr[4]='ceshi' where id=2;
UPDATE 1
postgres=> select * from test04 where id=2;
id | name_arr | len_arr
----+---------------------+-----------
2 | {Lu,zhi,shen,ceshi} | {2,3,4,6}
(1 row)
数组的操作符如下:
操作符 | 描述 | 举例 | 结果 |
---|---|---|---|
= | 等于 。 两个数组值完全一样,顺序也必须一样 | select array[1,2,3]=array[1,2,3]; | t |
<> | 不等于,两个数组不同,即便元素相同,但是位置不同也不相等 | select array[1,2,3]=array[1,3,2]; | f |
< | 小于 | select array[1,2,3]t |
|
> | 大于 | select array[1,3,4]>array[1,2,4] | t |
<= | 小于等于 | select array[1,2,3]<=array[1,2,3]; | t |
>= | 大于等于 | select array[1,2,3]》=array[1,2,3]; | t |
@> | 包含,前者包含后者 | select array[1,2,3,4]@>array[1,4]; | t |
<@ | 被包含,后者包含前者 | select array[1,4]@>array[1,3,4,5]; | |
&& | 重叠(具有公共元素) | select array[1,3,5] && array[3,5] | t |
ll | 将数组与数组串接或者元素与数组串接 | select array[1,2,3] |
除了在数组插入、删除、更新中介绍的函数array_append、array_remove外,还有以下几种函数:
1.获取数组长度的函数array_length:
postgres=> select array_length(array[1,3,4,5,6],1);
array_length
--------------
5
(1 row)
2.获取数组纬度的函数array_ndims:
postgres=> select array_ndims(array[1,3,4,5,6]);
array_ndims
-------------
1
(1 row)
postgres=> select array_ndims(array[[1,3],[4,5]]);
array_ndims
-------------
2
(1 row)
3.获取指定元素在数组中第一次出现的位置的函数array_position:
postgres=> select array_position(array['a','b','e','g','b'],'b');
array_position
----------------
2
(1 row)
4.替换数组元素的函数array_replace:
postgres=> select array_replace(array['a','b','e','g','b'],'b','ss');
array_replace
---------------
{a,ss,e,g,ss}
(1 row)
注意:替换操作会将所有符合的元素都替换成新元素。
5.将数据元素输出到字符串的函数array_to_string:
xzxt=> select array_to_string(array['a','b','e','g','b'],',');
array_to_string
-----------------
a,b,e,g,b
(1 row)
xzxt=> select array_to_string(array['a','b','e','g','b'],'|');
array_to_string
-----------------
a|b|e|g|b
(1 row)
输出是指定元素之间的分隔符!!
另外还可以处理数组中的空元素,例如将数组[1,2,3,null.4]输出为字符串,以逗号隔开,空的元素设为数字0:
# 未处理null
xzxt=> select array_to_string(array[1,2,null,4],',');
array_to_string
-----------------
1,2,4
(1 row)
# 将元素为null的替换成0
xzxt=> select array_to_string(array[1,2,null,4],',','0');
array_to_string
-----------------
1,2,0,4
(1 row