首页 > 解决方案 > Postgresql -> JSON 数组到行

问题描述

我表中的一列包含 JSONArray 数据。我在 jsonb 列中使用了 jsonb_agg() 到视图。现在视图中的数据如下所示

[
  {
    "Android": 2,
    "Windows": 1,
    "Macintosh": 1
  },
  {
    "iOS": 1,
    "Android": 2,
    "Windows": 2,
    "Macintosh": 2
  },
  {},
  {
    "Android": 1,
    "Windows": 1
  },
  {
    "Android": 1
  },
  {
    "iOS": 1,
    "Android": 2
  },
  {
    "iOS": 2,
    "Android": 1
  },
  {
    "iOS": 2
  },
  {
    "Android": 1
  },
  {
    "iOS": 2,
    "Windows": 1
  },
  {
    "Android": 5
  },
  {},
  {},
  {
    "iOS": 1,
    "Android": 1
  },
  {},
  {},
  {
    "Windows": 3
  }
]

但是,我需要产生以下结果

{
  "Android": 16,
  "Windows": 8,
  "Macintosh": 3,
  "iOS": 9
}

PostgreSQL中有没有办法实现这一点?

标签: jsonpostgresql

解决方案


是的,有办法。这里是。

select to_jsonb(t.*) from
(
 select 
    sum((j->>'Android')::numeric) "Android", 
    sum((j->>'Windows')::numeric) "Windows", 
    sum((j->>'Macintosh')::numeric) "Macintosh", 
    sum((j->>'iOS')::numeric) "iOS" 
 from jsonb_array_elements('[{"Android": 2, "Windows": 1, "Macintosh": 1}, {"iOS": 1, "Android": 2, "Windows": 2, "Macintosh": 2}, {}, {"Android": 1, "Windows": 1}, {"Android": 1}, {"iOS": 1, "Android": 2}, {"iOS": 2, "Android": 1}, {"iOS": 2}, {"Android": 1}, {"iOS": 2, "Windows": 1}, {"Android": 5}, {}, {}, {"iOS": 1, "Android": 1}, {}, {}, "Windows": 3}]'::jsonb) as j
) as t;

作为参数化查询:

select to_jsonb(t.*) from
(
 select 
    sum((j->>'Android')::numeric) "Android", 
    sum((j->>'Windows')::numeric) "Windows", 
    sum((j->>'Macintosh')::numeric) "Macintosh", 
    sum((j->>'iOS')::numeric) "iOS" 
 from jsonb_array_elements(?::jsonb) as j
) as t;

推荐阅读