CodeGym /课程 /SQL SELF /数组数据的修改: array_append()array_remov...

数组数据的修改: array_append()array_remove()

SQL SELF
第 35 级 , 课程 3
可用

数组数据的修改:array_append()array_remove()

有时候数组不只是用来看,还得改:比如加个新值、删掉旧的、或者更新内容。好在 PostgreSQL 给咱们准备了专门的函数,能很方便地操作数组内容,不用手动重写整个数组,就是 array_append()array_remove()。来看看它们咋用。

array_append() 给数组加元素

array_append() 这个函数就是用来往数组末尾加新元素的。它要俩参数:

  1. 你想改的原始数组。
  2. 你想加进数组的值。

例子 1:简单的数字数组

假设咱们有个表叫 projects,有一列 team_members,里面存着参与项目的用户 ID 数组。

CREATE TABLE projects (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    team_members INT[]
);

-- 插入几行数据
INSERT INTO projects (name, team_members)
VALUES
('项目A', ARRAY[1, 2, 3]),
('项目B', ARRAY[4, 5]);

现在有个“项目A”,咱们想给 team_members 这个数组加个新成员,ID 是 7。用 array_append()

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = '项目A';

-- 看下结果:
SELECT * FROM projects;

结果:

id name team_members
1 项目A {1,2,3,7}
2 项目B {4,5}

你看,ID 为 7 的成员已经加进数组啦!

例子 2:加文本元素

同样的 array_append() 也能用在别的类型的数组上。比如,咱们给商品的类别数组加个新类别。

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    categories TEXT[]
);

-- 插入带类别的商品
INSERT INTO products (name, categories)
VALUES
('智能手机', ARRAY['电子产品', '小玩意']),
('笔记本', ARRAY['电脑', '电子产品']);

-- 给“智能手机”加个新类别“热门”
UPDATE products
SET categories = array_append(categories, '热门')
WHERE name = '智能手机';

-- 看下结果:
SELECT * FROM products;

结果:

id name categories
1 智能手机 {电子产品,小玩意,热门}
2 笔记本 {电脑,电子产品}

array_remove() 从数组里删元素

如果说 array_append() 像是往待办清单里加任务,那 array_remove() 就是把已经做完的任务划掉。这个函数要俩参数:

  1. 原始数组。
  2. 你想删掉的值。

例子 1:从数字数组里删元素

咱们回到 projects 表。现在知道 ID 为 7 的成员不再参与“项目A”了,把他从 team_members 里删掉:

UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = '项目A';

-- 看下结果:
SELECT * FROM projects;

结果:

id name team_members
1 项目A {1,2,3}
2 项目B {4,5}

array_remove() 成功把 ID 为 7 的成员删掉了。

例子 2:删文本元素

再看下 products 表。如果“热门”这个类别对智能手机不合适了,可以删掉它:

UPDATE products
SET categories = array_remove(categories, '热门')
WHERE name = '智能手机';

-- 看下结果:
SELECT * FROM products;

结果:

id name categories
1 智能手机 {电子产品,小玩意}
2 笔记本 {电脑,电子产品}
注意:

如果你想删的元素本来就不在数组里,array_remove() 会让数组 保持不变。这点很方便,因为不会报错啥的。

组合用 array_append()array_remove()

有时候咱们得先确认元素不在数组里,再加进去。可以这样组合用:

例子:加唯一元素

比如,咱们想让 ID 为 7 的成员只在数组里出现一次。可以用 array_remove() 检查:

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = '项目A' AND NOT (team_members @> ARRAY[7]);

-- 看下结果:
SELECT * FROM projects;

解释:

  • @> 这个操作符用来检查数组里有没有 7
  • 如果 team_members 已经有 7,就不会再加了。

常见错误和建议

1. 往数组里加 NULL 如果你用 array_append()NULL(比如 array_append(team_members, NULL)),那数组里就会多一个 NULL。不会报错,但结果可能不是你想要的。建议加之前先检查下是不是 NULL

-- 检查例子:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = '项目A';

2. 数组里混用不同类型的数据。 PostgreSQL 的数组只能存同一种类型的值。比如你不能往数字数组里加字符串:

-- 这样会报错:
UPDATE projects
SET team_members = array_append(team_members, 'example');

避免这种情况,记得类型要一致。如果不确定,可以用 :: 转一下类型:

-- 类型转换例子:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION