Arrays 处理空列值时,在连接数组列的同时保持一致的PostgreSQL数组列索引
给定以下起始数据:Arrays 处理空列值时,在连接数组列的同时保持一致的PostgreSQL数组列索引,arrays,postgresql,join,null,Arrays,Postgresql,Join,Null,给定以下起始数据: 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
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;
我想在多个表之间进行外部联接,每个表都有一个固定长度的数组列,该数组列在给定的表中是统一的,但每个表可能不同(如上面的示例所示),将每个表中的数组列连接到一个大数组列中。我想知道是否有一种有效或直接的方法来维护新组合列中的一致索引,将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}
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)
我希望结果如下所示:
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)
因此,每一行都包含一个长度为15的数组。为了回答我自己的问题,下面是我提出的一个查询,它似乎完成了这项工作。对我来说,它似乎不是特别优雅或有效,所以肯定还有其他答案
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);
n长度?每行可以有不同的长度吗?那么你认为价值最大吗?如果是这样,那么如何处理较短的行呢?对不起,我的描述有些混乱。每个表都有一个数组列,该列在该表中具有统一的长度,但如果有意义的话,我不一定事先知道特定表的数组长度。因此表1可能有一个长度为10的数组列,表2可能有一个长度为3的数组列。在我的用例中,我不能硬编码这些值。