PostgreSQL 教程: 数组数据类型

八月 23, 2023

摘要:在本教程中,我们将向您展示如何使用 PostgreSQL 数组,并向您介绍一些用于数组操作的方便函数。

数组在 PostgreSQL 中扮演着重要的角色。每个数据类型都有它自己相应的数组类型,例如,integer有一个integer[]数组类型,character有一个character[]数组类型,等等。如果你定义了自己的数据类型,PostgreSQL 会在后台为你创建一个相应的数组类型。

PostgreSQL 允许您将列定义为任何有效数据类型的数组,包括内置类型、用户定义类型或枚举类型。

以下 CREATE TABLE 语句创建contacts表,并将phones列定义为文本数组。

CREATE TABLE contacts (
	id serial PRIMARY KEY,
	name VARCHAR (100),
	phones TEXT []
);

phones列是一个一维数组,保存联系人可能拥有的各种电话号码。

插入 PostgreSQL 数组值

以下语句将新联系人插入contacts表中。

INSERT INTO contacts (name, phones)
VALUES('John Doe',ARRAY [ '(408)-589-5846','(408)-589-5555' ]);

我们使用ARRAY构造器构造一个数组并将其插入到contacts表中。您还可以使用花括号,如下所示:

INSERT INTO contacts (name, phones)
VALUES('Lily Bush','{"(408)-589-5841"}'),
      ('William Gate','{"(408)-589-5842","(408)-589-58423"}');

上面的语句向contacts表中插入两行。请注意,当您使用花括号时,您需要使用单引号'来包裹数组,并使用双引号"来包裹文本数组项。

查询数组数据

您可以使用 SELECT 语句查询数组数据,如下所示:

SELECT
	name,
	phones
FROM
	contacts;

postgresql array 查询数据

我们使用方括号[]内的下标来访问数组元素。默认情况下,PostgreSQL 对数组元素使用从一开始的编号。这意味着第一个数组元素以数字 1 开头。假设我们想要获取联系人的姓名和第一个电话号码,我们使用以下查询:

SELECT
	name,
	phones [ 1 ]
FROM
	contacts;

postgresql array 查询数组项

我们可以在 WHERE 子句中使用数组元素作为过滤行的条件。例如,要找出谁拥有电话号码(408)-589-58423作为第二个电话号码,我们使用以下查询。

SELECT
	name
FROM
	contacts
WHERE
	phones [ 2 ] = '(408)-589-58423';

postgresql array where 子句中的数组元素

修改 PostgreSQL 数组

PostgreSQL 允许您更新数组的每个元素或整个数组。以下语句更新William Gate的第二个电话号码。

UPDATE contacts
SET phones [2] = '(408)-589-5843'
WHERE ID = 3;

我们再检查一下。

SELECT
	id,
	name,
	phones [ 2 ]
FROM
	contacts
WHERE
	id = 3;

postgresql array 更新

以下语句更新整个数组。

UPDATE contacts
SET phones = '{"(408)-589-5843"}'
WHERE id = 3;

我们使用以下语句验证更新。

SELECT
	name,
	phones
FROM
	contacts
WHERE
	id = 3;

postgresql array 查询

在 PostgreSQL 数组中检索

假设,我们想知道谁拥有电话号码(408)-589-5555,无论电话号码在phones数组中的位置如何,我们使用如下的ANY()函数:

SELECT
	name,
	phones
FROM
	contacts
WHERE
	'(408)-589-5555' = ANY (phones);

postgresql array any 函数

展开数组

PostgreSQL 提供了将数组展开为行列表的unnest()函数。例如,以下查询会展开phones数组中的所有电话号码。

SELECT
	name,
	unnest(phones)
FROM
	contacts;

postgresql array unnest 函数

在本教程中,我们向您展示了如何使用 PostgreSQL 数组数据类型,并向您介绍了一些最重要的数组运算符和函数。