↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 7.0 已于 2005 年 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"}}');

现在,我们可以在 sal_emp 上运行一些查询。首先,我们 展示如何一次访问数组的一个元素。下面的查询检索 第二季度薪水发生变化的员工的姓名:

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

 name
-------
 Carol
(1 row)

Postgres 对数组使用 "one-based"(从 1 开始)的 编号约定——也就是说,一个有 n 个元素的数组从 array[1] 开始,以 array[n] 结束。

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

SELECT pay_by_quarter[3] FROM sal_emp;

 pay_by_quarter
----------------
          10000
          25000
(2 rows)

我们也可以访问数组的任意切片或子数组。数组切片 通过为一个或多个数组维度写 "lower subscript : upper subscript" 来表示。下面的查询检索 Bill 周计划前两天的第一项:

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

      schedule
--------------------
 {{"meeting"},{""}}
(1 row)

我们也可以写成

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

结果相同。

可以完整地替换一个数组值:

UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
    WHERE name = 'Carol';

或者在单个项上更新:

UPDATE sal_emp SET pay_by_quarter[4] = 15000
    WHERE name = 'Bill';

或者在切片上更新:

UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
    WHERE name = 'Carol';

目前无法调整数组值的大小,只能完整替换;例如,我们不能通过对 array[5] 的单次赋值把一个四元素的数组值变成五元素的值。

CREATE TABLE 的语法允许定义定长数组:

CREATE TABLE tictactoe (
    squares   int4[3][3]
);

然而,当前的实现并不强制数组的大小限制——其行为与未指定 长度的数组相同。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。