↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 6.5 已结束支持。 请参阅 当前版本手册.

第 8 章 数组

注意

这里必须变成一个关于数组行为的章节。有人志愿吗?- thomas 1998-01-12

Postgres允许把实例的属性定义为定长或变长的多维数组。可以创建任何基本类型或用户定义类型的数组。为了说明它们的用途,我们先创建一个带有基本类型数组的类。

CREATE TABLE SAL_EMP (
    name            text,
    pay_by_quarter  int4[],
    schedule        text[][]
);

上面的查询将创建一个名为 SAL_EMP 的类,其中有一个 text 字符串(name)、一个 int4 的一维数组(pay_by_quarter,表示员工的季度薪水)以及一个 text 的二维数组(schedule,表示员工的周计划)。现在我们做一些 INSERTS;注意,向数组追加时,我们把值用花括号括起来并用逗号分隔。如果你了解 C,这很像初始化结构的语法。

INSERT INTO SAL_EMP
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {}}');

INSERT INTO SAL_EMP
    VALUES ('Carol',
    '{20000, 25000, 25000, 25000}',
    '{{"talk", "consult"}, {"meeting"}}');

默认情况下,Postgres 对数组使用 "one-based"(从 1 开始)的编号约定——也就是说,一个有 n 个元素的数组从 array[1] 开始,以 array[n] 结束。现在,我们可以在 SAL_EMP 上运行一些查询。首先,我们展示如何一次访问数组的一个元素。下面的查询检索第二季度薪水发生变化的员工的姓名:

SELECT name
    FROM SAL_EMP
    WHERE SAL_EMP.pay_by_quarter[1] <>
    SAL_EMP.pay_by_quarter[2];

+------+
|name  |
+------+
|Carol |
+------+

这个查询检索所有员工的第三季度薪水:

SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP;


+---------------+
|pay_by_quarter |
+---------------+
|10000          |
+---------------+
|25000          |
+---------------+

我们也可以访问数组的任意切片或子数组。下面的查询检索 Bill 周计划前两天的第一项。

SELECT SAL_EMP.schedule[1:2][1:1]
    FROM SAL_EMP
    WHERE SAL_EMP.name = 'Bill';

+-------------------+
|schedule           |
+-------------------+
|{{"meeting"},{""}} |
+-------------------+

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.