postgres json_populate_recordset无法按预期工作

时间:2016-10-14 23:22:15

标签: json postgresql

我有一个名为slices的表,其中包含一些简单的json对象,如下所示:

id | payload                               | metric_name
---|---------------------------------------|------------
1  | {"a_percent":99.97,"c_percent":99.97} | metric_c
2  | {"a_percent":98.37,"c_percent":97.93} | metric_c

这方面的许多记录。我想知道这个:

a_percent | c_percent
----------|----------
99.97     | 99.97
98.37     | 97.93

我正在创建该类型,并以下列方式使用json_populate_recordsetjson_agg

CREATE TYPE c_history AS(
    "a_percent" NUMERIC(5, 2),
    "c_percent" NUMERIC(5, 2)
);

SELECT * FROM
    json_populate_recordset(
        NULL :: c_history,
        (
            SELECT json_agg(payload::json) FROM slices
            WHERE metric_name = 'metric_c'
        )
    );

子句select json_agg(...)本身会产生一个很好的json对象数组,如预期的那样:

[{"a_percent":99.97,"c_percent":99.97}, {"a_percent":98.37,"c_percent":97.93}]

但是当我在json_populate_recordset内运行时,我会得到Error : ERROR: must call json_populate_recordset on an array of objects

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您不需要使用json_agg,因为您似乎希望在单独的a_percent中获取c_percentid个值记录。而只需按以下方式调用json_populate_recordset

SELECT id, (json_populate_record(null::c_history, payload)).* FROM slices

答案 1 :(得分:1)

这是@ TimBiegeleisen解决方案的变体,其中json_populate_record()子句中使用了函数from

select id, r.* 
from slices, 
lateral json_populate_record(null::c_history, payload) r;

请参阅rextesterSqlFiddle