PostgreSQL数组操作

本文详细介绍了PostgreSQL中数组字段的定义、插入、查询、修改和搜索方法,包括如何在创建表时声明数组字段,如何使用数组构造器插入值,以及如何通过下标和切片方式访问数组元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组(Arrays)

Postgres 允许把字段定义为可变长度的数组. 数据的类型可以是内置的类型, 用户自定义的类型或者枚举类型.

在创建表时声明数组字段:

CREATE TABLE rock_band
(
   name text,
   members text[]
)

上面的语句将创建一张 rock_band 表, 它定义了一个text类型的字段 name 来表示乐队的名称, 还有一个 members 字段以二维数组的类型来保存队员的名字.

插入数组值

INSERT INTO rock_band
VALUES
('Led Zeppelin',
'{"Page", "Plant", "Jones", "Bonham"}'
)

注意: 数组元素值是用双引号引起来的, 如果是单引号就会出错的.

查询出来将是这样的:

postgres=# select * from rock_band;
            name    |       members
    --------------+---------------------------
     Led Zeppelin | {Page,Plant,Jones,Bonham}
    (1 row)

另一种方法是插入的时候使用数组的构造器:

INSERT INTO rock_band
    VALUES
    ('Pink Floyd',
    ARRAY['Barrett', 'Gilmour']
    )

当使用数组构造器的时候, 数组元素是用单引号.

postgres=# select * from rock_band;
            name    |       members
    --------------+---------------------------
     Led Zeppelin | {Page,Plant,Jones,Bonham}
     Pink Floyd   | {Barrett,Gilmour}
    (2 rows)

访问数组类型

数组类型的值可以通过下标和切片的方式访问:

postgres=# select name from rock_band where members[2] = 'Plant';
    name
--------------
 Led Zeppelin
(1 row)

postgres=# select members[1:2] from rock_band;
      members
-------------------
 {Page,Plant}
 {Barrett,Gilmour}
(2 rows)

修改数组值

数组字段可以更新某个数组元素或者整个值:

更新单个元素:

postgres=# UPDATE rock_band set members[2] = 'Waters' where name = 'Pink Floyd';
UPDATE 1
postgres=# select * from rock_band where name = 'Pink Floyd';
     name    |       members
------------+------------------
 Pink Floyd | {Barrett,Waters}
(1 row)

更新整个字段值:

postgres=# UPDATE rock_band set members = '{"Mason", "Wright", "Gilmour"}' where name = 'Pink Floyd';
UPDATE 1
postgres=# select * from rock_band where name = 'Pink Floyd';
name        |        members
------------+------------------------
 Pink Floyd | {Mason,Wright,Gilmour}
(1 row)

在数组中搜索

要在数组中查找某个特定元素值, 可以使用ANY关键词.

postgres=# select name from rock_band where 'Mason' = ANY(members);
    name
------------
 Pink Floyd
(1 row)

postgres=# select name from rock_band where 'Barrett' = ANY(members);
 name
------
(0 rows)

要查找数组中所有值都匹配某个值, 可以使用ALL.

### PostgreSQL 数组类型概述 PostgreSQL 支持一维或多维数组作为数据存储的一种方式。这种特性允许在一个单独的表列中保存多个相同类型的值,从而简化某些复杂结构的数据管理[^1]。 #### 创建带有数组类型的表格 定义包含数组字段的表时,在类型后面加上方括号 `[]` 来表示该列为数组形式: ```sql CREATE TABLE students ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, courses TEXT[], -- 存储课程列表 grades INTEGER[] -- 成绩记录可以是一个整数数组 ); ``` #### 插入含有数组的数据 向具有数组属性的表内添加新纪录可以通过直接指定具体的数值来完成: ```sql INSERT INTO students (name, courses, grades) VALUES ('Alice', ARRAY['Math','Physics'], '{90,85}'); ``` 这里使用了两种不同的语法风格:一种是通过 `ARRAY` 构造器;另一种则是简单的花括号 `{}` 表达式[^2]。 #### 查询与过滤基于数组的内容 当需要检索特定条件下的记录时,可运用标准 SQL 的比较运算符以及专门针对数组设计的操作符来进行筛选: ```sql SELECT * FROM students WHERE 'Chemistry' = ANY(courses); -- 查找选修化学课的学生 ``` 上述命令会返回所有其 `courses` 列中含有 `'Chemistry'` 这门科目的学生信息。 #### 处理单个元素或子集 对于更复杂的场景,比如获取某个位置上的具体项或是截取部分序列,则需要用到索引和切片功能: ```sql SELECT courses[1], grades[2:3] FROM students; -- 获取第一个课程名及成绩中的第二到第三个分数 ``` 此语句展示了如何访问单一成员(即第一个人所学的第一门科目),同时也示范了怎样提取连续区间的片段(例如第二个至第三个人的成绩区间)。 #### 展开数组成多行显示 有时希望把每一个数组组件都独立呈现出来而不是作为一个整体展示给用户,这时就可以借助内置函数 `unnest()` 实现这一目标: ```sql SELECT unnest(grades) AS single_grade FROM students; ``` 这段代码将会把每条学生的各科成绩拆分成单独的一行输出[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值