有時候我們不只要讀陣列,還要改它:加新值、刪掉舊的、更新內容。幸好 PostgreSQL 有專門的函式,讓你不用手動重寫整個陣列就能輕鬆管理內容,就是 array_append() 跟 array_remove()。來看看它們怎麼用吧!
用 array_append() 加元素到陣列
array_append() 這個函式是用來把新元素加到陣列最後面。它要兩個參數:
- 你想要修改的原始陣列。
- 你想加進去陣列的值。
範例 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」的專案,想要把 ID 是 7 的新成員加到 team_members 陣列裡。用 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:從數字陣列刪元素
回到 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);
GO TO FULL VERSION