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

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

不受支持的版本: 6.5 / 6.4
历史版本PostgreSQL 6.5 已于 2004 年 6 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

63.2. 非原子值

关系模型的信条之一是关系的属性是原子的。Postgres 没有 这个限制;属性本身可以包含可以从查询语言访问的子值。例如,你可以创建由基本类型构成的数组属性。

63.2.1. 数组

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 对数组使用"从 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"},{""}} |
+-------------------+

提交更正

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