配列データの変更: array_append(), array_remove()
配列って、読むだけじゃなくて中身を変えたいときもあるよね。新しい値を追加したり、古いのを消したり、中身を更新したり。ありがたいことに、PostgreSQLには配列の中身を手軽にいじれる専用関数があるんだ。手動で全部書き直さなくてもOK。array_append() と array_remove() を使えば簡単!どう動くか見てみよう。
array_append() で配列に要素を追加する
array_append() 関数は、配列の末尾に新しい要素を追加するためのもの。引数は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: 数値配列から要素を削除
さっきの 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);
GO TO FULL VERSION