選び方はarray_agg(ARRAY[f1_date,ARRAY[f2_int,f3_decimal]])
?結合date
とinteger
ARRAYにエラーがあります。
upd:アレイをどこでどのように使用するかを説明する画像を追加しました。問題はdbサイズです。3列を多次元配列に変換した後、十分なスペースを節約できます。200Mではなく4M行になります。各行には、最大500個の要素を含む配列があります。
2 に答える
Postgresの配列は、すべての次元で同じ基本要素を共有します。
匿名レコードの配列
匿名レコードの配列を(基本タイプとして)構築できます。
SELECT array_agg((i,d))
FROM (
VALUES
(1::int, 2.3::decimal)
,(2, 3.4)
,(3, 4.5)
) x(i, d);
ただし、名前で匿名レコードのサブフィールドにアクセスすることはできないため、これはかなり扱いにくいです(名前は存在しません!)。よく知られているタイプで操作する方が実用的かもしれません..
ベースタイプとしての複合タイプ
複合型を作成し、それを配列の基本型として使用します。
CREATE TYPE int_dec AS (i int, d decimal);
SELECT '(1, 2.3)'::int_dec AS id_base
,'{"(1, 2.3)","(2, 3.4)","(3, 4.5)"}'::int_dec[] AS id_arr
-- Build an array from composite base type
SELECT array_agg(a)
FROM (
VALUES
('(1, 2.3)'::int_dec)
,('(2, 3.4)'::int_dec)
,('(3, 4.5)'::int_dec)
) x(a);
-- Build an array from composite base type
SELECT array_agg((i,d)) AS anonymous_arr
,array_agg((i,d)::int_dec) AS id_arr
FROM (
VALUES
(1::int, 2.3::decimal)
,(2, 3.4)
,(3, 4.5)
) x(i, d);
基本タイプとしてのテーブル
どのテーブルも複合型として機能できます。
db=# CREATE TEMP TABLE int_dec (i int, d decimal);
CREATE TABLE
db=# INSERT INTO int_dec VALUES (1, 2.3), (2, 3.4), (3, 4.5);
INSERT 0 3
db=# SELECT array_agg(id) FROM int_dec id;
array_agg
---------------------------------
{"(1,2.3)","(2,3.4)","(3,4.5)"}
Text
共通点として
別の方法は、すべてのデータ型をPostgreSQLにキャストしたり、PostgreSQLにキャストして戻したりして、を構築できるtext
ため、すべての値をにキャストすることです。text
multi-dimensional array
そのためには、多次元配列を集約することに興味があるかもしれません。この関連する質問の下での答えを検討してください:
Postgres配列へのデータの選択
しかし、私の経験では、複雑な配列を作成するよりも優れた解決策があることがよくあります。
PostgreSQLは複数のタイプを組み合わせた配列をサポートしていないと思います。すべての日付またはすべての整数のいずれかである必要がありますが、両方を混在させることはできません。
さて、本当に両方を組み合わせたい場合は、日付を整数に変換できますが、Unix時間を使用します。たとえば、1359478323はISO 8601:2013-01-29 16:52:03Zを表します。双方向変換ライブラリは、ほとんどすべてのプログラミング言語で見つけることができます。