簡體   English   中英

Postgresql中一個級別的Unnest多維數組

[英]Unnest multi dimensional array by one level in Postgresql

假設我有這個三維數組:

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}}

有類似問題的答案,解決了二維數組的問題,例如這個 ,但那些不適用於n維數組。

這是一個基本的任務,但在PostgreSQL中它似乎相當棘手。

我真的希望有人可以提供一種更簡單的方法來做到這一點,但這是我的鏡頭:

  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將數組組合在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM