PostgreSQL Json_build_object / json_agg 添加聚合级别

Flo*_*w91 0 sql arrays postgresql json aggregate-functions

我使用的是 PostgreSQL 10.4,由 Visual C++ build 1800,64 位编译;

下面的查询产生一个 1 列的结果集,类型为 JSON 和多行,我要求查询将每一行返回到一个数组(基本上是 1 行和 1 列)中,例如 json_agg()。

不幸的是,如果我将 json_agg() 放在 json_build_object 周围,我会收到一个错误,这是不可能的:

ERROR:  aggregate function calls cannot be nested
LINE 28:  '$values', json_agg(fv.*)
Run Code Online (Sandbox Code Playgroud)
SELECT json_build_object(
    'id', vl.id,
    'id_form', vl.id_form,
    'id_waardenlijst', vl.id_waardenlijst,
    '$values', json_agg(fv.*)
) FROM var_list vl
    LEFT JOIN testscheme.form_values fv
    on fv.id_form_record = vl.id
    GROUP BY vl.id, vl.id_form, vl.id_waardenlijst
Run Code Online (Sandbox Code Playgroud)

如何添加另一层聚合,返回 1 列和 1 行以及我想要的对象数组?

我希望我很清楚!

GMB*_*GMB 5

基本上,您需要另一个级别的聚合:

SELECT json_agg(js) js_final
FROM (
    SELECT json_build_object(
        'id', vl.id,
        'id_form', vl.id_form,
        'id_waardenlijst', vl.id_waardenlijst,
        '$values', json_agg(fv.*)
    ) js
    FROM var_list vl
    LEFT JOIN testscheme.form_values fv ON on fv.id_form_record = vl.id
    GROUP BY vl.id, vl.id_form, vl.id_waardenlijst
) t
Run Code Online (Sandbox Code Playgroud)