postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。且postgresql既支持一维数组,也支持多维数组。
使用array构建数组类型
highgo=# select array[1,2,3,4];
array
-----------
{1,2,3,4}
(1 行记录)
highgo=# select array[[1,2],[3,4]];
array
---------------
{{1,2},{3,4}}
(1 行记录)
创建包含数组类型字段的表,其中int[]表示不限制数组长度,设定数组长度的方式:int[4]
highgo=# create table arraytest(inttype int,intshuzu int[],varshuzu varchar(32)[][]);
CREATE TABLE
highgo=# INSERT into arraytest(inttype,intshuzu,varshuzu) values (1,array[1,2],array[['a','b'],['c','d']]),(2,array[3,4,5],array[['a','b','c','h'],['d','e','f','g']]);
INSERT 0 2
查询数组类型字段内容
highgo=# select * from arraytest;
inttype | intshuzu | varshuzu
---------+----------+-----------------------
1 | {1,2} | {{a,b},{c,d}}
2 | {3,4,5} | {{a,b,c,h},{d,e,f,g}}
(2 行记录)
--查询数组类型字段时,查询维度要与数组维度对应否则查询不到相关内容
highgo=# select intshuzu[1],varshuzu[1] from arraytest;
intshuzu | varshuzu
----------+----------
1 |
3 |
(2 行记录)
highgo=# select intshuzu[2],varshuzu[1][2] from arraytest;
intshuzu | varshuzu
----------+----------
2 | b
4 | b
(2 行记录)
highgo=# select intshuzu[2],varshuzu[1][3] from arraytest;
intshuzu | varshuzu
----------+----------
2 |
4 | c
(2 行记录)
highgo=# select intshuzu[2],varshuzu[2][1] from arraytest;
intshuzu | varshuzu
----------+----------
2 | c
4 | d
(2 行记录)
--非数组类型字段不能使用数组类型查询方式查询
highgo=# select inttype[1],intshuzu[1],varshuzu[1] from arraytest;
错误: 42804: 无法下标类型 integer, 因为它不是一个数组
--使用数组下标查询数组中连续的元素
highgo=# select intshuzu[1:2],varshuzu[1:2][1:3] from arraytest;
intshuzu | varshuzu
----------+-------------------
{1,2} | {{a,b},{c,d}}
{3,4} | {{a,b,c},{d,e,f}}
(2 行记录)