banner
ニュース センター
当社の製品は、快適、便利、そして安全な体験を保証します。

PostgreSQL での配列の使用: ガイド

Aug 31, 2023

テーブルの SQL イメージについて考えるとき、おそらく、SELECT クエリと、入れ子構造のないデータ ポイントごとに 1 行の概念が思い浮かぶでしょう。

しかし、数値や製品などのリストを行内に保存したい場合はどうすればよいでしょうか?

リストを多数の行に拡張することもできますが、行が密集して追跡が困難になる可能性があります。 幸いなことに、PostgreSQL はリストの保存と操作に使用できる配列データ型を提供します。

ARRAY を使用すると、PostgreSQL ではテーブルの列を可変長の多次元配列として定義できます。 組み込みまたはユーザー定義の基本型、列挙型、複合型、範囲型、またはドメインの配列を作成できます。

配列はさまざまな形式を取ることができ、配列を宣言するには複数の方法があります。

以下に示すように、列のデータ型宣言の後にキーワード ARRAY を使用して、宣言前のデータ型の配列を作成することを示すことができます。

text[] のように、データ型宣言の後に角括弧を付けることもできますが、これはあまり明示的ではないと思います。 また、キーワード version は SQL 標準に準拠しません。

次の例では、ショッピング カードを模擬する小さなテーブルを作成し、そこに複数の製品のいくつかの順列を入力します。 完全なクエリを実行すると、配列が出力としてどのように表現されるかも確認できます。

テーブルに配列を追加するもう 1 つの方法は、括弧付きの ARRAY キーワードの代わりに {} 構文を使用することです。 どちらの方法でも機能します。 中括弧で囲まれた引用符に細心の注意を払う必要があります。 繰り返しになりますが、キーワード構文がより明示的で、括弧が他のプログラミング言語の配列表現に近いことがわかりましたが、どちらも正常に機能します。

データ サイエンスの詳細については、データ サイエンスの面接で知っておくべき 10 の高度な SQL 概念を参照してください。

実際に、製品情報テーブルに結合したり、リスト項目ごとに他の操作を実行したりするために、特定の行の配列を展開またはネスト解除する必要がある場合はどうなるでしょうか?

問題ない。 PostgreSQL の配列は、UNNEST キーワードを使用して簡単にネストを解除できます。

予想どおり、UNNEST は元の行のそれぞれの配列の項目ごとに 1 行を作成します。

さらなる操作のために単一の項目にアクセスするたびに、配列のネストを解除する必要があるかどうか疑問に思うかもしれません。 その場合、結局のところ、配列構造は良いアイデアではない可能性があります。 幸いなことに、PostgreSQL の配列では、以下に示すように、括弧とスライスを使用したインデックス付けによるアクセスが可能です。 これにより、たとえば、すべてのリストの最初の項目や、リスト内の特定の範囲の項目を簡単に選択できます。

PostgreSQL 配列のインデックス付けは 0 からではなく 1 から始まります。これは、他のプログラミング言語で慣れているものとは異なる場合があります。

スライスは [start:end] 構文で機能します。 3 つ以上の配列要素を持つすべての行に対するスライスによる配列項目へのアクセス。

配列に含まれる項目の数がわからない場合、または上記で行ったように配列のサイズでフィルター処理したい場合は、CARDINALITY キーワードを使用できます。 これにより、配列内の項目の数が整数として返されます。

配列内の特定の製品を含むすべてのショッピング カートを選択したい場合はどうすればよいでしょうか? それとも配列項目に基づく他のフィルター操作ですか? 問題ありません。PostgreSQL では、WHERE 句の項目値を ANY キーワードと組み合わせて使用​​できます。

以下では、products 配列列に「product_c」を含む行をフィルター処理しています。 このフィルタリング方法は、単一のフィルタ値の場合に最も役立ちます。

上記のフィルター ロジックを拡張して、特定のサブ配列を含むショッピング カードを要求することもできます。 ここでは、「contains」を表す「@>」演算子を使用しています。 次のように読み取ることができます。

「製品配列には配列 ['product_a', 'product_b'] が含まれています。」

配列および配列値は、以下に示すように、UPDATE … SET … 句を使用して、他のデータ型と同様に更新できます。 インデックス作成を通じて単一の配列項目を更新することも、配列全体を更新することもできます。