我有一個 JSONB 列,其中每一行包含多個物件的陣列。
'[{"a": 1}, {"b": 2}, {"c": 0.5}]'::jsonb
我想將所有這些合并到一個物件中:
'{"a": 1, "b": 2, "c": 0.5}'::jsonb
我曾嘗試使用coalesce合并它們但沒有成功。我也一直在使用 Postgres 的多個其他內置函式,但似乎無法弄清楚這一點。
有任何想法嗎?
uj5u.com熱心網友回復:
您需要取消嵌套陣列,然后將鍵/值聚合回單個物件:
select (select jsonb_object_agg(e.ky, e.val)
from jsonb_array_elements(t.the_column) as x(element)
cross join jsonb_each(x.element) as e(ky,val))
from the_table t;
請注意,如果陣列包含重復鍵,則“最后一個”將在這種情況下獲勝(因為 JSON 不允許重復鍵)
使用 Postgres 12 或更高版本,可以稍微簡化一下:
select (select jsonb_object_agg(e.item ->> 'key', e.item -> 'value')
from jsonb_path_query(t.the_column, '$[*].keyvalue()') as e(item))
from the_table t
uj5u.com熱心網友回復:
CTE 解決方案:
WITH cte (
each_json
) AS (
SELECT
jsonb_path_query('[{"a": 1}, {"b": 2}, {"c": 0.5}]'::jsonb, '$[*]')
),
cte1 AS (
SELECT
(jsonb_each(each_json)).*
FROM
cte
)
SELECT
jsonb_object_agg(key, value)
FROM
cte1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497097.html
標籤:PostgreSQL
