最初の結合の結果はテキスト文字列ではなくJSONとして扱うため、 jsonb_each()
を使用します。 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
GROUP BY t.employee
の省略形です。 。
結果:
employee | sales
---------+--------
Jim | '{ "sales_tv" : 40, "sales_radio" : 76 }'
また、クエリを解きほぐして簡略化しました。
json_object_agg()
名前と値のペアをJSONオブジェクトとして集約するのに役立ちます。オプションでjsonb
にキャストします それが必要な場合-またはjsonb_object_agg()
を使用します Postgres9.5以降で。
明示的なJOIN
の使用 最も明白な場所に条件を付加するための構文。
同じ 明示的なJOIN
なし 構文:
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;