Postgresql:如何获得 json 其中一列是键而另一列是值?

Postgresql: How to get a json where one column is the key and another column is the value?

我有一个table如下。 repliesto 是一个唯一的非空列,devicetokens 是一个数组:

CREATE TABLE devices(
                     repliesto    TEXT PRIMARY KEY CHECK (repliesto <> ''), 
                     devicetokens TEXT[] NOT NULL 
                       CHECK (ARRAY_LENGTH(devicetokens, 1) IS NOT NULL 
                          AND ARRAY_LENGTH(devicetokens, 1) > 0)
);

示例数据:

SELECT * FROM devices ;
repliesto devicetokens
user1 {a}
user2 {b,c}

我需要得到一个 json,其中 repliesto 列是键,devicetokens 数组是值,如下所示:

{"user1": ["a"], "user2": ["b","c"]}

我可以使用这个:

SELECT jsonb_agg(json_build_object(repliesto, devicetokens)) FROM devices;

但这给了我以下信息:

[{"user1": ["a"]}, {"user2": ["b", "c"]}]

这与我想要的不同,因为它是每个单独行的数组 json。我想要一个 json(不是数组),其中 repliesto 列是键,devicetokens 数组是值。我该怎么做?

在 PostgreSQL v9.5+ 中有一个聚合函数 json_object_agg(name, value)

SELECT 
  json_object_agg(repliesto, array_to_json(devicetokens))
FROM 
  devices;

结果:

{ "user1" : ["a"], "user2" : ["b","c"] }

欢迎您在db<>fiddle

中试用