簡體   English   中英

如何並行取消嵌套多個postgres jsonb arrays

[英]How to unnest multiple postgres jsonb arrays in parallel

我想一次迭代兩個 jsonb arrays 的元素。 如果它只是一個數組,我知道我可以簡單地使用 json_array_elements 一切都會好起來的。 但是對於多個 arrays 我很難想出一個解決方案。

類似於Unnest multiple arrays in parallel ,但僅適用於 jsonb arrays。 所以我知道對於常規的 postgres arrays 有 unnest(anyarray, anyarray [, ...])。

這是我的示意圖數據場景的片段:

SELECT *
FROM jsonb_to_recordset('[{"id": 0, "array_a": ["a", "c"], "array_b": ["b" , "d"]}]') 
AS example(id jsonb, array_a jsonb, array_b jsonb)

我想轉換為:

a | b

c | d

希望有人可以幫助我。

最好的祝願安迪

with ordinality一起使用並連接到 zip 值:

with invars as (
  SELECT *
    FROM jsonb_to_recordset('[{"id": 0, "array_a": ["a", "c"], "array_b": ["b" , "d"]}]') 
      AS example(id jsonb, array_a jsonb, array_b jsonb)
)
select a1, b1
  from invars
       cross join lateral jsonb_array_elements(array_a) with ordinality as ela(a1, rn)
       cross join lateral jsonb_array_elements(array_b) with ordinality as elb(b1, rn)
 where ela.rn = elb.rn;

工作小提琴。

如果 arrays 可以有不同的長度,那么即使有可能更優雅的解決方案,這仍然有效:

with invars as (
  SELECT *
    FROM jsonb_to_recordset('[{"id": 0, "array_a": ["a", "c", "e"], "array_b": ["b" , "d", "f", "h"]}]')
      AS example(id jsonb, array_a jsonb, array_b jsonb)
), a_side as (
  select a1, rn
    from invars
         cross join lateral jsonb_array_elements(array_a) with ordinality as ela(a1, rn)
), b_side as (
  select b1, rn
    from invars
         cross join lateral jsonb_array_elements(array_b) with ordinality as elb(b1, rn)
)
select a1, b1
  from a_side
       full join b_side
         on a_side.rn = b_side.rn
;

更新了小提琴。

您可以連續應用JSONB_ARRAY_ELEMENTS()JSONB_ARRAY_ELEMENTS_TEXT()函數,包括ORDINALITY選項

WITH t2 AS
(
SELECT (elm -> 'array_a')::JSONB AS a, (elm -> 'array_b')::JSONB AS b
  FROM t
 CROSS JOIN JSONB_ARRAY_ELEMENTS(jsdata) 
  WITH ORDINALITY AS q(elm, i) 
)
SELECT col1, col2
  FROM t2
  JOIN JSONB_ARRAY_ELEMENTS_TEXT(a) WITH ORDINALITY AS q1(col1, i) ON TRUE 
  JOIN JSONB_ARRAY_ELEMENTS_TEXT(b) WITH ORDINALITY AS q2(col2, j) ON i=j 

演示

暫無
暫無

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

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