既存テーブルへの配列列の追加
このステップでは、PostgreSQL で配列列を追加および操作する方法を学びます。既存の products テーブルを拡張し、タグを格納するための配列列を追加します。配列列を使用すると、単一の列に同じデータ型の複数の値を格納でき、タグ、カテゴリ、または機能などの項目のリストを格納するのに役立ちます。
前のステップからデータベースに接続済みで products テーブルも存在するため、既存のテーブルに配列列を追加しましょう。
ALTER TABLE products ADD COLUMN name VARCHAR(255);
ALTER TABLE products ADD COLUMN tags TEXT[];
これらのコマンドは、既存の products テーブルに name (文字列) と tags (文字列の配列) という 2 つの新しい列を追加します。TEXT[] データ型は、tags 列がテキスト値の配列であることを指定します。
各 ALTER コマンドに対して、以下のような出力が表示されるはずです。
ALTER TABLE
次に、既存のデータを更新し、新しい列を持つ新しいデータを挿入しましょう。
UPDATE products SET name = data ->> 'name' WHERE id = 1;
UPDATE products SET name = data ->> 'name' WHERE id = 2;
UPDATE products SET tags = ARRAY['electronics', 'computers', 'portable'] WHERE id = 1;
UPDATE products SET tags = ARRAY['electronics', 'accessories', 'input'] WHERE id = 2;
これらのコマンドは、JSONB データから抽出された名前とタグの情報、および新しい配列値で既存の製品を更新します。
各 UPDATE に対して、以下のような出力が表示されるはずです。
UPDATE 1
配列データをクエリするには、配列インデックスを使用できます。PostgreSQL では、配列のインデックスは 1 から始まります。
たとえば、最初の製品の最初のタグを取得するには、次のクエリを使用できます。
SELECT tags[1] FROM products WHERE id = 1;
このコマンドは、id が 1 である products テーブルの tags 配列のインデックス 1 の要素を選択します。
以下のような出力が表示されるはずです。
tags
-----------
electronics
(1 row)
UNNEST 関数を使用して、配列を行のセットに展開することもできます。
たとえば、すべての製品からすべてのタグを取得するには、次のクエリを使用できます。
SELECT name, UNNEST(tags) AS tag FROM products;
このコマンドは、tags 配列から name と個々の tag を選択し、各タグに対して新しい行を作成します。
以下のような出力が表示されるはずです。
name | tag
---------+-------------
Laptop | electronics
Laptop | computers
Laptop | portable
Keyboard| electronics
Keyboard| accessories
Keyboard| input
(6 rows)
@> 演算子を使用して、配列に特定の値が含まれているかどうかを確認できます。
たとえば、「electronics」タグを持つすべての製品を見つけるには、次のクエリを使用できます。
SELECT name FROM products WHERE tags @> ARRAY['electronics'];
このコマンドは、products テーブルから、tags 配列に値「electronics」が含まれているすべての行の名前を選択します。
以下のような出力が表示されるはずです。
name
----------
Laptop
Keyboard
(2 rows)
&& 演算子を使用して、2 つの配列に共通の要素があるかどうかを確認することもできます。
たとえば、最初の製品とタグを共有しているすべての製品を見つけるには、次のクエリを使用できます。
SELECT p2.name FROM products p1, products p2 WHERE p1.id = 1 AND p1.tags && p2.tags AND p2.id != 1;
このコマンドは、products テーブル (エイリアス p2) から、最初の製品 (エイリアス p1) のタグと少なくとも 1 つのタグを共有しているすべての行の名前を選択します。ただし、最初の製品自体は除外します。
以下のような出力が表示されるはずです。
name
----------
Keyboard
(1 row)
完璧です!既存のテーブルに配列列を正常に追加し、配列の操作方法を学びました。これで、products テーブルには JSONB データ型と配列データ型の両方が含まれるようになり、次のステップの準備が整いました。