您的位置:首页 > 数据库

postgresql----数组类型和函数

2016-07-14 21:49 387 查看
postgresql支持数组类型,可以是基本类型,也可以是用户自定义的类型。日常中使用数组类型的机会不多,但还是可以了解一下。不像C或JAVA高级语言的数组下标从0开始,postgresql数组下标从1开始,既可以指定长度,也可以不指定长度。且postgresql既支持一维数组,也支持多维数组,但是平时二维数组也就够用了。

示例1.使用ARRAY构建数组类型

---1*4的一维数组
test=# select array[1,2,3,4];
array
-----------
{1,2,3,4}
(1 row)

--2*2的二维数组
test=# select array[[1,2],[3,4]];
array
---------------
{{1,2},{3,4}}
(1 row)
--1*2的二维数组,基本类型为box矩形类型,且和上面相比box类型元素之间是以分号分隔的,其他所有类型的数据都是以逗号分隔的
test=# select array[box'(1,1),(0,0)',box'(0,0),(-1,-1)'];
array
-----------------------------
{(1,1),(0,0);(0,0),(-1,-1)}
(1 row)


示例2.创建一张表,字段包含数组类型

其中int[]表示数组长度无限制,int[4]表示数组长度为4.

test=# create table tbl_array(a int[],b varchar(32)[][],c int);
CREATE TABLE
test=# insert into tbl_array (a,b,c) values (array[1,2],array[[1,2,3],[4,5,6]],1);
INSERT 0 1
test=# insert into tbl_array (a,b,c) values (array[1,2,3],array[[1,2],[4,5]],2);
INSERT 0 1
test=# select * from tbl_array ;
a    |         b         | c
---------+-------------------+---
{1,2}   | {{1,2,3},{4,5,6}} | 1
{1,2,3} | {{1,2},{4,5}}     | 2
(2 rows)

test=# select a[1],b[2] from tbl_array where c = 1;
a | b
---+---
1 |
(1 row)

test=# select a[1],b[2][1] from tbl_array where c = 1;
a | b
---+---
1 | 4
(1 row)

test=# select a[1],b[2][4] from tbl_array where c = 1;
a | b
---+---
1 |
(1 row)


test=# update tbl_array set a[1] = 200 where a[1] = 1;
UPDATE 1
test=# select a[1],b[2][4] from tbl_array ;
a  | b
-----+---
100 |
200 |
(2 rows)


也可以使用[下标:上标]方式来查询数组连续的某些元素。

test=# select a[2:3] from tbl_array ;
a
-------
{2}
{2,3}
(2 rows)

test=# select a[1:3] from tbl_array ;
a
-----------
{100,2}
{200,2,3}
(2 rows)


数组操作符与函数

操作符

操作符描述示例结果
=相等SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3];t
<>不等于select ARRAY[1,2,3] <> ARRAY[1,2,4];t
<小于select ARRAY[1,2,3] < ARRAY[1,2,4];t
>大于select ARRAY[1,4,3] > ARRAY[1,2,4];t
<=小于或等于select ARRAY[1,2,3] <= ARRAY[1,2,3];t
>=大于或等于select ARRAY[1,4,3] >= ARRAY[1,4,3];t
@>包含select ARRAY[1,4,3] @> ARRAY[3,1];t
<@包含于select ARRAY[2,7] <@ ARRAY[1,7,4,2,6];t
&&重叠(是否有相同元素)select ARRAY[1,4,3] && ARRAY[2,1];t
||数组与数组连接select ARRAY[1,2,3] || ARRAY[4,5,6];{1,2,3,4,5,6}
||数组与数组连接select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]];{{1,2,3},{4,5,6},{7,8,9}}
||元素与数组连接select 3 || ARRAY[4,5,6];{3,4,5,6}
||数组与元素连接select ARRAY[4,5,6] || 7;{4,5,6,7}
函数

函数返回类型描述示例结果
array_append
(anyarray,anyelement)
anyarray在数组末尾追加元素SELECT array_append(ARRAY[1,2], 3);

{1,2,3}
array_cat
(anyarray,anyarray)
anyarray连接两个数组SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]);{1,2,3,4,5}
array_ndims
(anyarray)
int返回数组维数SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]);2
array_dims
(anyarray)
text返回数组维数的文本表示SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]);[1:2][1:3]
array_fill
(anyelement,int[], [, int[]])
anyarray使用提供的值和维度初始化一个数组,其中anyelement是值,第一个int[]是数组的长度,第二个int[]是数组下界,下界默认是1SELECT array_fill(7, ARRAY[3], ARRAY[2]);[2:4]={7,7,7}
array_length
(anyarray,int)
int返回数组指定维度的长度SELECT array_length(array[1,2,3], 1);3
array_lower
(anyarray,int)
int返回数组指定维度的下界SELECT array_lower('[0:2]={1,2,3}'::int[], 1);0
array_position
(anyarray,anyelement [, int])
int返回数组元素anyelement从数组的[,int]位置(默认为1)开始第一次出现在数组中的位置,数组必须是一维的SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');2
array_positions
(anyarray,anyelement)
int[]返回元素在数组中的所有位置SELECT array_positions(ARRAY['A','A','B','A'], 'A');{1,2,4}
array_prepend
(anyelement,anyarray)
anyarray在数组开头添加新的元素SELECT array_prepend(1, ARRAY[2,3]);{1,2,3}
array_remove
(anyarray,anyelement)
anyarray从数组中删除所有的指定元素,必须是一维数组SELECT array_remove(ARRAY[1,2,3,2], 2);{1,3}
array_replace
(anyarray,anyelement, anyelement)
anyarray替换指定数组元素为新的元素SELECT array_replace(ARRAY[1,2,5,4], 5, 3);{1,2,3,4}
array_to_string
(anyarray,text [, text])
text将数组元素使用分隔符连接为文本,NULL可以使用指定元素替换SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*');1,2,3,*,5
array_upper
(anyarray,int)
int数组指定维度的上届SELECT array_upper(ARRAY[1,8,3,7], 1);4
cardinality
(anyarray)
int返回数组所有维度的长度总和,如果是空数组则返回0SELECT cardinality(ARRAY[[1,2],[3,4]]);4
string_to_array
(text,text [, text])
text[]将文本使用分隔符分隔后转换为数组,如果指定第三个参数,则第三个参数在数组中被转换为NULLSELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy');{xx,NULL,zz}
unnest
(anyarray)
setof anyelement将数组元素转换为行SELECT unnest(ARRAY[1,2]);1
2

unnest
(anyarray, anyarray[, ...])
setof anyelement, anyelement [, ...]将多维数组转换为行集合,其中第一个数组显示为第一列,第二个数组显示为第二列,以此类推。但是这个函数只在from子句中使用SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);unnest | unnest
--------+----
1 | foo
2 | bar
| baz

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: