2016-06-23 6 views
1

与えられる以下の起動データ:私は外側を行いたい 一貫したPostgreSQLのアレイ列インデックスを更新する値

CREATE TABLE t1 AS 
    SELECT generate_series(1, 20) AS id, 
    (SELECT array_agg(generate_series) FROM generate_series(1, 6)) as array_1; 

CREATE TABLE t2 AS 
    SELECT generate_series(5, 10) AS id, 
    (SELECT array_agg(generate_series) FROM generate_series(7, 10)) as array_2; 

CREATE TABLE t3 AS 
    SELECT generate_series(8, 15) AS id, 
    (SELECT array_agg(generate_series) FROM generate_series(11, 15)) as array_3; 

は、複数のテーブル間の結合、固定長の各(上記の例のように)テーブルごとに異なる場合があり、各テーブルの配列列を1つの大きな配列列に連結します。私は、 NULLの列値(外部結合によって引き起こされる)を NULL値の配列に置き換えて、最終的な配列列の長さが均一になるように、新しい結合列の一貫性のある索引付けを維持する方法があるかどうか疑問に思っていました。上記の例とは違って、私の実際の使用例では、各テーブルの配列列の長さが先読み であることはわかりません。、その表全体で一様な長さになります。

SELECT id, (array_1 || array_2 || array_3) AS combined_array FROM 
t1 LEFT OUTER JOIN t2 USING(id) LEFT OUTER JOIN t3 USING (id); 

生成します:、代わりにこのクエリの他の言葉では、各行は、の配列を含むように

id |   combined_array 
----+--------------------------------------- 
1 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
2 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
3 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
4 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
5 | {1,2,3,4,5,6,7,8,9,10,NULL,NULL,NULL,NULL,NULL} 
6 | {1,2,3,4,5,6,7,8,9,10,NULL,NULL,NULL,NULL,NULL} 
7 | {1,2,3,4,5,6,7,8,9,10,NULL,NULL,NULL,NULL,NULL} 
8 | {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 
9 | {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 
10 | {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 
11 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,11,12,13,14,15} 
12 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,11,12,13,14,15} 
13 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,11,12,13,14,15} 
14 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,11,12,13,14,15} 
15 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,11,12,13,14,15} 
16 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
17 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
18 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
19 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
20 | {1,2,3,4,5,6,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} 
(20 rows) 

id |   combined_array 
----+--------------------------------------- 
1 | {1,2,3,4,5,6} 
2 | {1,2,3,4,5,6} 
3 | {1,2,3,4,5,6} 
4 | {1,2,3,4,5,6} 
5 | {1,2,3,4,5,6,7,8,9,10} 
6 | {1,2,3,4,5,6,7,8,9,10} 
7 | {1,2,3,4,5,6,7,8,9,10} 
8 | {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 
9 | {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 
10 | {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 
11 | {1,2,3,4,5,6,11,12,13,14,15} 
12 | {1,2,3,4,5,6,11,12,13,14,15} 
13 | {1,2,3,4,5,6,11,12,13,14,15} 
14 | {1,2,3,4,5,6,11,12,13,14,15} 
15 | {1,2,3,4,5,6,11,12,13,14,15} 
16 | {1,2,3,4,5,6} 
17 | {1,2,3,4,5,6} 
18 | {1,2,3,4,5,6} 
19 | {1,2,3,4,5,6} 
20 | {1,2,3,4,5,6} 
(20 rows) 

を私が見えるように結果をしたいと思います長さ15

+0

長さ?各列の長さを変えることはできますか?あなたは最大の価値を取っていますか?もしそうなら、もっと短い行をどうすればいいですか? –

+0

申し訳ありませんが、私の説明は多少混乱しています。各テーブルは、そのテーブル全体にわたって一様な長さを持つ配列列を持ちますが、それが意味をなされるならば、必ずしも特定のテーブルの配列の長さを事前に知っているわけではありません。したがって、テーブル1は長さ10の配列列を持ち、表2は長さ3の配列列を持つ可能性があります。私の場合、これらの値をハードコードすることはできません。 –

答えて

1

私自身の質問に答えるために、ここで私が思いついた質問は仕事をするようです。特にエレガントで効率的なようではないので、他の回答にはまだまだオープンしています。

SELECT id, (
    coalesce(array_1, array_fill(NULL::INT, 
    ARRAY[(SELECT max(array_length(array_1, 1)) FROM t1)])) || 
    coalesce(array_2, array_fill(NULL::INT, 
    ARRAY[(SELECT max(array_length(array_2, 1)) FROM t2)])) || 
    coalesce(array_3, array_fill(NULL::INT, 
    ARRAY[(SELECT max(array_length(array_3, 1)) FROM t3)])) 
) AS combined_array FROM 
t1 LEFT OUTER JOIN t2 USING(id) LEFT OUTER JOIN t3 USING (id); 
関連する問題