PostgreSQL でのネスト解除

Bilal Shahid 2023年6月20日
  1. PostgreSQL unnest () 機能
  2. PostgreSQL unnest() の使用
PostgreSQL でのネスト解除

この記事では、unnest() キーワードと PostgreSQL でのその使用法について、複数の例を挙げて説明します。

PostgreSQL unnest () 機能

PostgreSQL では、配列をデータ型として使用できます。 言語での配列の使いやすさの向上に関連する複数の関数もあります。

unnest() 関数は、今日説明する多くの配列機能の 1つです。 ただし、基本的な機能はunnest()という言葉から明らかです。つまり、配列を行に展開します。

配列を表形式で表示しようとする場合、これは不可欠です。 PostgreSQL では、この機能により、配列を一連の特異値に展開して、表形式で行として表すことができます。

古いバージョンの PostgreSQL では、他の PostgreSQL 機能でも使用できるこの unnest() 機能に置き換えられた、配列の拡張を実現するための遅くて複雑な方法がありました。

他の PostgreSQL 機能と組み合わせて使用すると、操作がより簡単で高速になる可能性が大きく広がります。

PostgreSQL unnest() の使用

基本的な機能から始めて、ゆっくりとより複雑なユースケースに進んでいきます。 構文は unnest(array) です。

配列の個々の値をすべて取得し、それらをテーブルの行の形式で表示されるセットに入れるだけです。

注: unnest() キーワードに配列を指定する必要があります。 例: unnest (array_to_expand)

それでは、それぞれの重要な機能の例に移りましょう。

シンプルな 1 次元配列での PostgreSQL unnest () 関数の使用

5 までの自然数の配列があるとします。 それらを展開してテーブルの行として表示する簡単な方法は、それらをネスト解除することです。

SELECT unnest (ARRAY[1,2,3,4,5]);

5 桁すべてを表形式 (5 行) で出力します。

postresql で unnest - 出力 1

では、数値ではなく言葉で正確に試してみて、変化があるかどうかを確認してみましょう。

SELECT unnest (ARRAY['apple', 'oranges', 'mango']);

3 個のすべての単語を表形式 (3 行) で出力します。

postresql で unnest - 出力 2

ご覧のとおり、整数とテキストの両方で完全に機能します。

シンプルな多次元配列で PostgreSQL unnest () 関数を使用する

上記の 1D 配列に unnest () 関数を適用する方法を説明しました。 以下の例は、2D 配列での使用方法を示しています。

SELECT unnest (array[array[1, 2], array[2, 3], array[4,5]]);

6 桁すべてが表形式で表示され、合計 6 行が表示されます。

postresql で unnest - 出力 3

複数の配列で同時に PostgreSQL unnest () 関数を使用する

このセクションでは、複数の配列で同時に unnest () 関数を使用する方法を示します。 配列は、異なるデータ型にすることもできます。

unnest () 関数を使用した後、各配列はテーブルの列として表示され、配列の値が行として表示されます。

unnest (array1, array2, array3…) と書くことができます。 以下の例は、概念を明確にするのに役立ちます。

SELECT * FROM
unnest
(
    array [1, 2, 3],
    array ['HP', 'AMD', 'APPLE']
)
AS data(ID, Company);

各配列を列として、内部の値をそれらの列の行として表を表示します。

postresql で unnest - 出力 4

2つの配列の要素数が等しくない別の例を見てみましょう。

SELECT * FROM
unnest
(
    array [1, 2, 3],
    array ['HP', 'AMD', 'APPLE', 'DELL']
)
AS data(ID, Company);

この例では、IDs よりも 1つ多い会社があります。 この場合、短い方は補正のために NULLS でパディングされ、テーブルはエラーなしで表示されます。

postresql で unnest - 出力 5

ORDER BY 句で PostgreSQL unnest () 関数を使用する

PostgreSQL の unnest () 関数は、ORDER BY 句と一緒に使用することもできます。 例を挙げて説明します。

ORDER BY 句を使用する方法の 1つは、配列の順序付けを利用することです。 この場合、結果は 2 列目 (Company) に従って並べ替えられます。

SELECT * FROM
unnest
(
    array [1, 2, 3],
    array ['HP', 'AMD', 'APPLE']
)
AS data(ID, Company) ORDER BY 2;

postresql で unnest - 出力 6

ORDER BY 句を使用する別の方法は、AS を使用して配列に名前を割り当てることです。 この場合、結果は 2 番目の列 (ランキング) に従って並べ替えられます。

SELECT * FROM
unnest
(
    array['HP', 'AMD', 'APPLE'],
    array[23,14,1]
)
AS data(Company, Ranking) ORDER BY Ranking;

postresql で unnest - 出力 7

PostgreSQL unnest () 関数を LIMIT 句とともに使用する

PostgreSQL では、unnest () 関数を LIMIT 句とともに使用できます。

この場合、結果のテーブル (配列の展開後) は、LIMIT 句で説明されている条件に制限されます。 以下の例は、アイデアを明確にします。

SELECT unnest (array[1,2,3,4,5,6])
LIMIT 3;

配列の最初の 3 値のみが行として表示されます。

postresql でアンネスト - 出力 8

LIMITOFFSET コマンドを使用することもできます。

SELECT unnest (array[1,2,3,4,5,6])
LIMIT 3 OFFSET 3;

最初の 3 の値をスキップし、最後の 3 の値 (4,5,6) のみを結果テーブルの行として表示します。

postresql で unnest - 出力 9

DISTINCT 節で PostgreSQL unnest () 関数を使用する

DISTINCT 句は、複数のデータベース言語で重複を削除するために使用されます。

PostgreSQL では、整数、文字列など、あらゆる種類のデータの重複をすべて削除できますが、表形式のデータの重複のみを削除できるという制限があります。

この制限により、配列から重複を削除することが困難になります。 ただし、unnest () 機能を使用すると、この問題をすばやく解決できます。

unnest () コマンドを使用して、まず配列の値を表形式に変換できます。 次に、DISTINCT 句を簡単に適用して重複を削除できます。

この考え方は、理解のために以下の例に示されています。

SELECT DISTINCT unnest (array['HP', 'DELL', 'APPLE','AMD', 'HP']);

この例では、配列は最初に unnest () を使用して表形式に変換されます。 次に、DISTINCT 句を適用して重複を削除します。 その結果、結果のテーブルには HP が 1 回だけ含まれます。

postresql で unnest - 出力 10

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub