从 Postgres 中的 2 个聚合列构建 JSON
Build JSON from 2 aggregated columns in Postgres
使用 Postgres-Db 作为 json-文档的来源,我需要将两列从 table 转换为 JSON-对象。
所以我有 "color_id"、"language" 和 "name" 列 table 颜色:
color_id | language | name
1 | "de" | "blau"
1 | "en" | "blue"
1 | "fr" | "bleu"
我想生成一个 JSON-对象,例如:
{
"de": "blau",
"fr": "bleu",
"en": "blue"
}
我从
开始
SELECT
array_to_json(array_agg((language::text, name::text))),
color_id
FROM colors
GROUP BY color_id;
不幸产生了
array to json | color_id
"[{"f1":"de","f2":"blau"} |
, {"f1":"en","f2":"blue"} | 1
, {"f1":"fr","f2":"bleu"}]" |
我认为这或多或少会很简单,但发现自己陷入了误导性结果和语法错误的死胡同。
此致,多米尼克
使用jsonb_object_agg()
:
with data(color_id, language, name) as (
values
(1, 'de', 'blau'),
(1, 'en', 'blue'),
(1, 'fr', 'bleu')
)
select color_id, jsonb_object_agg(language, name)
from data
group by 1;
color_id | jsonb_object_agg
----------+--------------------------------------------
1 | {"de": "blau", "en": "blue", "fr": "bleu"}
(1 row)
函数 jsonb_object_agg()
已在 Postgres 9.5.
中引入
在 Postgres 9.4 中使用 json_object_agg()
。
在 Postgres 9.3 中,您必须使用字符串函数构造结果:
select
color_id,
format('{%s}', string_agg(format('"%s": "%s"', language, name), ', '))::json
from data
group by 1;
对于键值对和适当的JSON数据,可以使用
with data(color_id, language, name) as (
values
(1, 'de', 'blau'),
(1, 'en', 'blue'),
(1, 'fr', 'bleu')
)
SELECT color_id,
json_agg((SELECT x FROM (SELECT language, name) AS x)) AS json_data
FROM data
group by "data".color_id;
使用 Postgres-Db 作为 json-文档的来源,我需要将两列从 table 转换为 JSON-对象。
所以我有 "color_id"、"language" 和 "name" 列 table 颜色:
color_id | language | name 1 | "de" | "blau" 1 | "en" | "blue" 1 | "fr" | "bleu"
我想生成一个 JSON-对象,例如:
{ "de": "blau", "fr": "bleu", "en": "blue" }
我从
开始SELECT array_to_json(array_agg((language::text, name::text))), color_id FROM colors GROUP BY color_id;
不幸产生了
array to json | color_id "[{"f1":"de","f2":"blau"} | , {"f1":"en","f2":"blue"} | 1 , {"f1":"fr","f2":"bleu"}]" |
我认为这或多或少会很简单,但发现自己陷入了误导性结果和语法错误的死胡同。
此致,多米尼克
使用jsonb_object_agg()
:
with data(color_id, language, name) as (
values
(1, 'de', 'blau'),
(1, 'en', 'blue'),
(1, 'fr', 'bleu')
)
select color_id, jsonb_object_agg(language, name)
from data
group by 1;
color_id | jsonb_object_agg
----------+--------------------------------------------
1 | {"de": "blau", "en": "blue", "fr": "bleu"}
(1 row)
函数 jsonb_object_agg()
已在 Postgres 9.5.
在 Postgres 9.4 中使用 json_object_agg()
。
在 Postgres 9.3 中,您必须使用字符串函数构造结果:
select
color_id,
format('{%s}', string_agg(format('"%s": "%s"', language, name), ', '))::json
from data
group by 1;
对于键值对和适当的JSON数据,可以使用
with data(color_id, language, name) as (
values
(1, 'de', 'blau'),
(1, 'en', 'blue'),
(1, 'fr', 'bleu')
)
SELECT color_id,
json_agg((SELECT x FROM (SELECT language, name) AS x)) AS json_data
FROM data
group by "data".color_id;