CodeGym /コース /SQL SELF /配列データの変更: array_append(), array_remo...

配列データの変更: array_append(), array_remove()

SQL SELF
レベル 35 , レッスン 3
使用可能

配列データの変更: array_append(), array_remove()

配列って、読むだけじゃなくて中身を変えたいときもあるよね。新しい値を追加したり、古いのを消したり、中身を更新したり。ありがたいことに、PostgreSQLには配列の中身を手軽にいじれる専用関数があるんだ。手動で全部書き直さなくてもOK。array_append()array_remove() を使えば簡単!どう動くか見てみよう。

array_append() で配列に要素を追加する

array_append() 関数は、配列の末尾に新しい要素を追加するためのもの。引数は2つ:

  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');

こうならないように、データ型が合ってるか確認しよう。迷ったら :: で型変換すればOK:

-- 型変換の例:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION