Postgresql,具有多个键的 jsonb 为每个键返回一行
Postgresql, jsonb with multiple keys is returning a single row for each key
这是我的情况。我的行有一个 json 列,而我一直在尝试做的是仅在一行中获取 json 中所有键的所有值。
假设我的行具有 json 值:
{"key1": "a", "key2": "b"}
现在,是否可以像这样提取值:["a", "b"]
?
到目前为止我尝试过这个:
select ---- some sum() fields ----,
b.match_data::json -> jsonb_object_keys(b.match_data) as "Course"
from --- tables ---
join -- tables ---
where -- condition ---
group by -- sum() fields ----, b.match_data
问题在于,对于具有多个键的 json,它会返回多行。
WITH jsondata AS (
SELECT '{"key1": "a", "key2": "b"}'::jsonb as data -- A
)
SELECT jsonb_agg(value) -- C
FROM jsondata, jsonb_each(data) -- B
Postgres JSON functions, Postgres (JSON) aggregate functions
A:CTE 处理您的数据
B:jsonb_each
扩展你的数据;结果:
key value
key1 "a"
key2 "b"
C:jsonb_agg
将 value
列聚合到一个 json 数组中,预期结果为:["a", "b"]
.
如果您不希望结果作为 json 数组,而是作为普通文本数组,您必须将 jsonb_each
更改为 jsonb_each_text
并将 jsonb_agg
更改为 array_agg
(参见 fiddle)
我使用 jsonb
作为类型。当然,类型 json
也存在所有函数。
(Postgres JSON types)
S-Man 的回答给了我使用聚合器的方向,经过几次尝试和错误后我得到了答案
(select string_agg((select value from jsonb_array_elements_text(value)), ',')
from jsonb_each(b.match_data)) "Course"
它将值收集并显示为 a, b,...
在一行中。
这是我的情况。我的行有一个 json 列,而我一直在尝试做的是仅在一行中获取 json 中所有键的所有值。
假设我的行具有 json 值:
{"key1": "a", "key2": "b"}
现在,是否可以像这样提取值:["a", "b"]
?
到目前为止我尝试过这个:
select ---- some sum() fields ----,
b.match_data::json -> jsonb_object_keys(b.match_data) as "Course"
from --- tables ---
join -- tables ---
where -- condition ---
group by -- sum() fields ----, b.match_data
问题在于,对于具有多个键的 json,它会返回多行。
WITH jsondata AS (
SELECT '{"key1": "a", "key2": "b"}'::jsonb as data -- A
)
SELECT jsonb_agg(value) -- C
FROM jsondata, jsonb_each(data) -- B
Postgres JSON functions, Postgres (JSON) aggregate functions
A:CTE 处理您的数据
B:jsonb_each
扩展你的数据;结果:
key value
key1 "a"
key2 "b"
C:jsonb_agg
将 value
列聚合到一个 json 数组中,预期结果为:["a", "b"]
.
如果您不希望结果作为 json 数组,而是作为普通文本数组,您必须将 jsonb_each
更改为 jsonb_each_text
并将 jsonb_agg
更改为 array_agg
(参见 fiddle)
我使用 jsonb
作为类型。当然,类型 json
也存在所有函数。
(Postgres JSON types)
S-Man 的回答给了我使用聚合器的方向,经过几次尝试和错误后我得到了答案
(select string_agg((select value from jsonb_array_elements_text(value)), ',')
from jsonb_each(b.match_data)) "Course"
它将值收集并显示为 a, b,...
在一行中。