我有一个有两个json列的表。表格如下:
┌────────────────────────┐──────────────────────────┐
│ source │ destination │
├────────────────────────┤──────────────────────────┤
│ {"a": 5, "b": 6} │ {"c": 9, "y":1} │
│ {"b": 6, "c": 9} │ {"x": 25,"y":5} │
└────────────────────────┘──────────────────────────┘
有没有办法写一个 SELECT ,1)从每一行中提取每个键/值,2)总结它们的值,如下所示?
┌────────────────────────┐──────────────────────────┐
│ source │ destination │
├────────────────────────┤──────────────────────────┤
│ {"a": 5} │ {"c": 9} │
│ {"b": 12} │ {"x": 25} │
| {"c": 9} | {"y":6} |
└────────────────────────┘──────────────────────────┘
答案 0 :(得分:0)
在最好的时候,这是一项不稳定的事业。打破json,通过键对值进行求和,然后构建一个简单的json很容易,但是在两列上做这个有点奇怪,而且肯定忽略了关系实体建模的一切好处(但是,你已经在使用了json所以在一条非常滑的路上走了一半...)但是这里有:
<强> PG9.4 + 强>
使用jsonb
。
SELECT json_build_object(srckey, srcsum) AS source,
json_build_object(destkey, destsum) AS destination
FROM (
SELECT row_number() OVER () AS rn, srckey, srcsum
FROM (
SELECT srckey, sum(srcval::int) AS srcsum
FROM my_table
JOIN jsonb_each_text(my_table.source) kv(srckey, srcval) ON true
GROUP BY 1
ORDER BY 1) sub
) subsrc
FULL JOIN (
SELECT row_number() OVER () AS rn, destkey, destsum
FROM (
SELECT destkey, sum(destval::int) AS destsum
FROM my_table
JOIN jsonb_each_text(my_table.destination) kv(destkey, destval) ON true
GROUP BY 1
ORDER BY 1) sub2
) subdest USING (rn);