假设我有这个三维数组:
ARRAY[[['abc', 'def'], ['ghi', 'jkl']], [['mno', 'pqr'], ['stu', 'vwx']]]
如何从中获得{{abc,def},{ghi,jkl}}
?
如果我尝试:
SELECT (ARRAY[[['abc', 'def'], ['ghi', 'jkl']], [['mno', 'pqr'], ['stu', 'vwx']]])[1:1]
我得到{{{abc,def},{ghi,jkl}}}
,但我需要{{abc,def},{ghi,jkl}}
。
对于类似问题,有一些答案可以解决二维数组(例如this one)的问题,但不适用于n维数组。
这是一个基本的任务,但在PostgreSQL中似乎很棘手。
答案 0 :(得分:1)
我真的希望有人可以提供一种更直接的方法,但这是我的镜头:
with my_array as
(select ARRAY[[['abc', 'def'], ['ghi', 'jkl']], [['mno', 'pqr'], ['stu', 'vwx']]] as arr),
deconstructed_array as (
select a.elem, a.nr, x, y, z
FROM my_array, unnest(arr) WITH ordinality as a(elem, nr)
JOIN (
SELECT x, y, z, row_number() over (ORDER BY x, y, z) as row
FROM my_array,
generate_series(array_lower(arr, 1), array_upper(arr, 1)) g1(x),
generate_series(array_lower(arr, 2), array_upper(arr, 2)) g2(y),
generate_series(array_lower(arr, 3), array_upper(arr, 3)) g3(z)
) array_dims ON nr = row
)
select array_agg(elems) FROM (
select array_agg(elem) as elems, x, y
FROM deconstructed_array GROUP BY x, y
) first_level
WHERE x = 1
group by x
;
array_agg
-----------------------
{{abc,def},{ghi,jkl}}
(1 row)
说明: 我们使用generate_series将数组的各个维度与未嵌套的行相关联。不幸的是,在这种情况下,我们需要知道这是一个三维数组,但是每个数组的长度都无关紧要。第二个CTE的输出如下所示:
elem | nr | x | y | z
------+----+---+---+---
abc | 1 | 1 | 1 | 1
def | 2 | 1 | 1 | 2
ghi | 3 | 1 | 2 | 1
jkl | 4 | 1 | 2 | 2
mno | 5 | 2 | 1 | 1
pqr | 6 | 2 | 1 | 2
stu | 7 | 2 | 2 | 1
vwx | 8 | 2 | 2 | 2
从那里开始,我们仅使用array_agg将数组重新组合在一起。