19

次のように定義されたテーブルがあるとします。

CREATE TABLE test_values(name TEXT, values INTEGER[]);

...そして次の値:

| name  | values  |
+-------+---------+
| hello | {1,2,3} |
| world | {4,5,6} |

私は返すクエリを見つけようとしています:

| name  | value |
+-------+-------+
| hello | 1     |
| hello | 2     |
| hello | 3     |
| world | 4     |
| world | 5     |
| world | 6     |

arrays へのアクセスに関する上流のドキュメントを確認しunnest()関数を使用したソリューションがどのようになるかを考えてみましたが、空になりました。

理想的なソリューションは、展開される配列以外に多数の列があり、主キーがない場合でも簡単に使用できます。複数の配列がある場合の処理​​は重要ではありません。

4

2 に答える 2

25

Raphaël が示唆するように、セットを返す関数unnest()SELECTリストに入れることができます。これは、Postgres 10 より前のコーナー ケースの問題を示していました。以下を参照してください。

LATERALPostgres 9.3 以降、これには結合も使用できます。FROMこれは、セットを返す関数をリストではなくリストに入れるための、よりクリーンで標準に準拠した方法SELECTです。

SELECT name, value
FROM   tbl, unnest(values) value;  -- implicit CROSS JOIN LATERAL

values微妙な違いが 1 つあります。これは、結果から空の / NULL を含む行を削除します。これは、行がunnest()返されないためです。一方、同じ行はFROMリスト内で NULL 値に変換され、とにかく返されます。100% 同等のクエリは次のとおりです。

SELECT t.name, v.value
FROM   tbl t
LEFT   JOIN unnest(t.values) v(value) ON true;

見る:

于 2015-08-14T02:45:25.000 に答える