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
中试用
我有一个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
中试用