CodeGym /課程 /SQL SELF /陣列資料的變更: array_append()、 array_remov...

陣列資料的變更: array_append()、 array_remove()

SQL SELF
等級 35, 課堂 3
開放

有時候我們不只要讀陣列,還要改它:加新值、刪掉舊的、更新內容。幸好 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」的專案,想要把 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. 原始陣列。
  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);
2
任務
SQL SELF, 等級 35, 課堂 3
上鎖
將元素加入陣列
將元素加入陣列
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION