两列的总和并将它们合并到Json行中

时间:2015-08-10 11:28:28

标签: json postgresql

我有一个有两个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}          |
└────────────────────────┘──────────────────────────┘

1 个答案:

答案 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);