PostgreSQL 支持数组类型,包括一维数组和多维数组,在某些应用场合数组的应用还是很需要的,
这里简单介绍下一维数组的使用及有关数组函数和操作符的使用。
--定义数组
mydb=> create table test_array(id serial primary key, phone int8[]);
NOTICE: CREATE TABLE will create implicit sequence "test_array_id_seq" for serial column "test_array.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_array_pkey" for table "test_array"
CREATE TABLE
mydb=> \d test_array
Table "mydb.test_array"
Column | Type | Modifiers
--------+----------+---------------------------------------------------------
id | integer | not null default nextval('test_array_id_seq'::regclass)
phone | bigint[] |
Indexes:
"test_array_pkey" PRIMARY KEY, btree (id)
--数组元素插入有两种方式
mydb=> insert into test_array(phone) values ('{1,2}');
INSERT 0 1
mydb=> insert into test_array(phone) values ('{2,3}');
INSERT 0 1
mydb=> insert into test_array(phone) values (array[3,4,5]);
INSERT 0 1
mydb=> select * From test_array;
id | phone
----+---------
1 | {1,2}
2 | {2,3}
3 | {3,4,5}
(3 rows)
--数组元素的引用
mydb=> select phone from test_array where id=1;
phone
-------
{1,2}
(1 row)
mydb=> select phone[1],phone[2] from test_array where id=1;
phone | phone
-------+-------
1 | 2
一 常见的数组操作(Array Operators)
--equal
mydb=> select array[1,2]=array[1.1,2.1]::int[];
?column?
----------
t
(1 row)
--not equal
mydb=> select array[1,2] <> array[1,2,3];
?column?
----------
t
(1 row)
--less than
mydb=> select ARRAY[1,2,3] < ARRAY[1,2,4];
?column?
----------
t
(1 row)
--greater than
mydb=> select ARRAY[1,4,3] > ARRAY[1,2,4];
?column?
----------
t
(1 row)
--contains
mydb=> select ARRAY[1,4,3] @> ARRAY[3,1];
?column?
----------
t
(1 row)
--is contained by
mydb=> select ARRAY[2,7] <@ ARRAY[1,7,4,2,6];
?column?
----------
t
(1 row)
--overlap (have elements in common)
mydb=> select ARRAY[1,4,3] && ARRAY[2,1];
?column?
----------
t
二 常见数组函数( Array Functions )
--将数据元素追加到数组
mydb=> select array_append(array[2,3,4],5);
array_append
--------------
{2,3,4,5}
(1 row)
--连接两个数组
mydb=> select array_cat(array[1,2],array[3,4]);
array_cat
-----------
{1,2,3,4}
(1 row)
--获得数组的维度
mydb=> select array_ndims(array[1,2,3]);
array_ndims
-------------
1
(1 row)
mydb=> select array_ndims(array[[1,2,3],[4,5,6]]);
array_ndims
-------------
2
(1 row)
--获得数组的长度 ^
mydb=> select array_length(array[1,2,3],1);
array_length
--------------
3
(1 row)
mydb=> select array_length(array[[1,2],[2,3]],1);
array_length
--------------
2
(1 row)
三 intarray 模块的数组函数
--获取元素个数据总和
mydb=> select icount(array[1,2]);
icount
--------
2
(1 row)
mydb=> select icount(array[[1,2],[2,3]]);
icount
--------
4
(1 row)
--排序
mydb=> select sort_asc(array[4,8,7]);
sort_asc
----------
{4,7,8}
(1 row)
mydb=> select sort_desc(array[4,8,7]);
sort_desc
-----------
{8,7,4}
(1 row)
mydb=> select sort_desc(array[[4,8,7],[8,9,7]]);
sort_desc
-------------------
{{9,8,8},{7,7,4}}
(1 row)
四 intarray 模块的数组操作符
--表数据
mydb=> select * from test_array;
id | phone
----+---------
1 | {1,2}
2 | {2,3}
3 | {3,4,5}
4 | {4,5,6}
5 | {4,5,7}
(5 rows)
--查找包括相同元素的记录
mydb=> select id ,phone from test_array where phone && array[1,2]::int8[];
id | phone
----+-------
1 | {1,2}
2 | {2,3}
(2 rows)
--查找数组元素的交集
mydb=> select array[1,2,3] & array[3,4,5];
?column?
----------
{3}
(1 row)
五 索引的使用
数组支持创建 GiST 和 GIN 类型索引,这两类索引的选择要根据场合,简单的说, GIN 类型索引在查询上要比
GiST 类型索引快,但在 update 的时候要慢些,所以 GIN 类型索引适合表数据不太变化的场合,而 GiST 索引适用
于表数据经常需要 UPDATE 的场景。