[英]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.