How do I return a jsonb array and array of objects from my data?

前端 未结 2 670
清酒与你
清酒与你 2020-12-21 17:43

I have the following table:

CREATE TABLE mytable (
  id       serial PRIMARY KEY
, employee text UNIQUE NOT NULL
, data     jsonb
);

With t

2条回答
  •  情深已故
    2020-12-21 18:40

    You treat the result of the first join as JSON, not as text string, so use jsonb_each() instead of jsonb_each_text():

    SELECT t.employee, json_object_agg(a.k, d.value) AS sales
    FROM   mytable t
    JOIN   LATERAL jsonb_each(t.data) a(k,v) ON a.k LIKE 'sales_%'
    JOIN   LATERAL jsonb_to_recordset(a.v) d(yr text, value float) ON d.yr = '2012'
    WHERE  t.employee = 'Jim'  -- works because employee is unique
    GROUP  BY 1;
    

    GROUP BY 1 is shorthand for GROUP BY t.employee.
    Result:

    employee | sales
    ---------+--------
    Jim      | '{ "sales_tv" : 40, "sales_radio" : 76 }'
    

    I also untangled and simplified your query.

    json_object_agg() is instrumental in aggregating name/value pairs as JSON object. Optionally cast to jsonb if you need that - or use jsonb_object_agg() in Postgres 9.5 or later.

    Using explicit JOIN syntax to attach conditions in their most obvious place.
    The same without explicit JOIN syntax:

    SELECT t.employee, json_object_agg(a.k, d.value) AS sales
    FROM   mytable t
         , jsonb_each(t.data)      a(k,v) 
         , jsonb_to_recordset(a.v) d(yr text, value float)
    WHERE  t.employee = 'Jim'
    AND    a.k LIKE 'sales_%'
    AND    d.yr = '2012'
    GROUP  BY 1;
    

提交回复
热议问题