PostgreSQL,具有多个键的jsonb为每个键返回一行

时间:2018-10-05 06:57:07

标签: sql postgresql jsonb

这就是我的处境。我有一排包含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,它会返回多行。

2 个答案:

答案 0 :(得分:1)

demo: db<>fiddle

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 functionsPostgres (JSON) aggregate functions

A:CTE处理您的数据

B:jsonb_each扩展您的数据;结果:

key    value
key1   "a"
key2   "b"

C:jsonb_aggvalue列聚合到具有预期结果:["a", "b"]的json数组中。


如果您不希望将结果作为json数组,而是作为普通文本数组,则必须将jsonb_each更改为jsonb_each_text,将jsonb_agg更改为array_agg(请参见小提琴)< / p>


我使用jsonb作为类型。当然,所有功能也都适用于类型json。 (Postgres JSON types

答案 1 :(得分:0)

S-Man的答案为我提供了使用聚合器的指导,经过几次尝试和错误后,我得到了答案

(select string_agg((select value from jsonb_array_elements_text(value)), ',')
from jsonb_each(b.match_data)) "Course"

它收集并在一行中显示为a, b,...的值。