今天我们来聊聊数组——PostgreSQL里很强大的一个工具,可以让你在一列里存储同一类型的值的列表。后面我们还会更详细地讲数组。
说到“数组”,大家肯定会想到列表。就像你去超市前写购物清单一样:苹果、香蕉、牛奶、面包。在PostgreSQL里,数组就像这样的清单,可以在一个字段里存好几个值,而且这些值都是同一种数据类型。比如数字数组、文本数组、日期数组等等。
来几个例子:
数字数组:
{1, 2, 3, 4}
字符串数组:
{"apple", "banana", "cherry"}
日期数组:
{2024-10-01, 2024-10-02, 2024-10-03}
数组让你能把很多值塞进一个字段,省表空间,还能让查询更灵活。
为什么要用数组?主要优点
数据存储更紧凑:多个值放一个字段里。对于逻辑上相关的数据特别有用。比如文章的标签列表,或者学生的成绩列表。为几个标签单独建一张表?
查询方便:数组可以直接从一个字段里拿到一整个值的列表,还能很容易操作数组里的单个元素。
性能:有些场景下,数组能避免为关联数据建额外的表,这样数据库结构更简单,开发也快点。谁不喜欢呢。
怎么在PostgreSQL里用数组?
在SELECT里创建数组
可以用ARRAY[]构造数组。比如:
-- 数字数组例子
SELECT ARRAY[1, 2, 3, 4];
-- 字符串数组例子
SELECT ARRAY['apple', 'banana', 'cherry'];
太简单了。我们来建个表,试试在里面查点东西。
创建带数组的表
先建个表,其中一列是数组。
| id | name - VARCHAR(50) | subjects - TEXT[] |
|---|---|---|
| 1 | Alex | {数学,物理} |
| 2 | Maria | {化学,生物,英语} |
| 3 | Peter | {信息学} |
看看结果:
SELECT * FROM students;
| id | name | subjects |
|---|---|---|
| 1 | Alex | {数学,物理} |
| 2 | Maria | {化学,生物,英语} |
| 3 | Peter | {信息学} |
从数组里取数据
PostgreSQL有不少函数和操作符可以用来从数组里取数据。
取数组的某个元素
要按索引取数组元素,用中括号[]。注意,索引从1开始(不是像大多数编程语言那样从0开始)。
-- 取每个学生的第一个科目
SELECT name, subjects[1] AS 第一个科目 FROM students;
结果如下:
| name | 第一个科目 |
|---|---|
| Alex | 数学 |
| Maria | 化学 |
| Peter | 信息学 |
取整个数组字段
要拿到数组的所有元素,直接用SELECT就行:
SELECT name, subjects FROM students;
在数组里查找值
有时候我们想知道数组里有没有某个值。可以用ANY操作符。
-- 查找学“数学”的学生
SELECT name
FROM students
WHERE '数学' = ANY(subjects);
查询结果:
| name |
|---|
| Alex |
PostgresQL里有超多数组相关的函数和操作符,后面还会讲到,敬请期待 :P
用数组时常见的坑
把0和1的索引搞混。
PostgreSQL数组索引是从1开始的。如果你习惯了Python或JavaScript那种从0开始的,容易搞晕。
空数组。
空数组{}和NULL在PostgreSQL里不是一回事。比较数组时别搞混了。
大数组的处理。
在数组里存太多数据会让查询变慢。数组适合存小量数据。
GO TO FULL VERSION