现在有一个内置马德利布功能来做到这一点 - array_unnest_2d_to_1d,这是在1.11版本中引入: http://madlib.incubator.apache.org/docs/latest/array__ops_8sql__in.html#af057b589f2a2cb1095caa99feaeb3d70
下面是一个例子用法:
CREATE TABLE test1 (pid int, points double precision[]);
INSERT INTO test1 VALUES
(100, '{{1.0, 2.0, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0}}'),
(101, '{{11.0, 12.0, 13.0}, {14.0, 15.0, 16.0}, {17.0, 18.0, 19.0}}'),
(102, '{{21.0, 22.0, 23.0}, {24.0, 25.0, 26.0}, {27.0, 28.0, 29.0}}');
SELECT * FROM test1;
产生
pid | points
-----+------------------------------------
100 | {{1,2,3},{4,5,6},{7,8,9}}
101 | {{11,12,13},{14,15,16},{17,18,19}}
102 | {{21,22,23},{24,25,26},{27,28,29}}
(3 rows)
然后调用函数UNNEST:
SELECT pid, (madlib.array_unnest_2d_to_1d(points)).*
FROM test1 ORDER BY pid, unnest_row_id;
产生
pid | unnest_row_id | unnest_result
-----+---------------+---------------
100 | 1 | {1,2,3}
100 | 2 | {4,5,6}
100 | 3 | {7,8,9}
101 | 1 | {11,12,13}
101 | 2 | {14,15,16}
101 | 3 | {17,18,19}
102 | 1 | {21,22,23}
102 | 2 | {24,25,26}
102 | 3 | {27,28,29}
(9 rows)
其中unnest_row_id是一个指数到2D阵列
谢谢,@Erwin,非常实用!它只需要被标记为STRICT。 – IamIC
@IamIC:谢谢,我补充说。 –