Arrays 如何将PostgreSQL中带有JSON数组字段的表解析为行?

Arrays 如何将PostgreSQL中带有JSON数组字段的表解析为行?,arrays,json,postgresql,Arrays,Json,Postgresql,我有一个包含json数组的表。以下是来自以下站点的字段内容示例: SELECT json_array FROM table LIMIT 5; 结果: [{“key1”:“value1”},{“key1”:“value2”},…,{“key2”:“value3”}] [] [] []{“键1”:“值1”} [] 如何检索所有值并计算找到的每个值的数量 我正在使用PostgreSQL 9.5.14,我已经在这里尝试了解决方案 还有另一位慷慨的stackoverflow用户在我的最后一个问题中向我提


我有一个包含json数组的表。以下是来自以下站点的字段内容示例:

SELECT json_array FROM table LIMIT 5;
结果:

[{“key1”:“value1”},{“key1”:“value2”},…,{“key2”:“value3”}]
[]
[]
[]{“键1”:“值1”}
[]

如何检索所有值并计算找到的每个值的数量

我正在使用PostgreSQL 9.5.14,我已经在这里尝试了解决方案 还有另一位慷慨的stackoverflow用户在我的最后一个问题中向我提出的建议:

我试过:

选择
值->“键1”
从…起
桌子
json_数组元素(json_数组);
遗憾的是,由于收到错误,
无法在标量上调用json\u数组\u元素

我尝试的另一个解决方案是:

选择json\u数组作为json,(json\u数组->0),
结合(
案例
当(json_数组->0)为空时,则为空
else(json_数组->0->>“键1”)
完,,
“无值”)作为“值”
从表中;
它只为“值”返回空值

我也尝试使用此解决方案:

带有json_测试(col)作为(
值(json_数组)
)
挑选
y、 x->“键1”和“键1”
从json_测试jt,
横向(选择json_数组_元素(jt.col)x)y;
但我需要能够将json_数组的所有元素都放入json_测试中

到目前为止,我只尝试列出所有json数组中的所有值,但我理想的查询最终结果如下:

价值|金额
---------------
值1 | 48
值2 | 112
值3 | 93
值4|0

再次感谢您在这方面的帮助,提前谢谢您。

  • 将数组展开为每个数组元素的一行
  • 将键/值对拆分为两列
  • 按新值列/计数分组

  • 再次感谢你。不幸的是,这返回了错误:“无法调用标量上的json_数组_元素”。@Lauri请检查演示,看看您的情况有什么不同。就我而言,这显然有效。也许你的桌子结构有点不同?@Lauri也许这有帮助?谢谢,这还返回“不能在标量上调用json_对象_键”。我这边一定有我没注意到的毛病。我将尝试在fiddle上复制我的问题,我还应该浏览我的json专栏,看看是否有任何异常导致了这一点。即使在我用limit 1结束查询并用您创建的selects查询空的[]json数组时,我仍然会收到这些“cannotcallonascalar”消息。我还仔细检查了列的类型是否为json。谢谢你的帮助!啊,不,你的小提琴每次都能用。我将试着看看我是否能在小提琴中重现我的错误。如果我能找到原因,我会发布一个解决方案。我发现了错误。这是因为表中的json数组被用引号保存。这就阻止了对列数据使用postgresql的任何原生json函数,如果不先将损坏的json数组类型转换为文本,则无法进行字符串操作。我正在使用SQLLab工具构造我的sql查询,它没有显示引号,这让我相信错误的原因在别处。
    SELECT
        each.value,
        COUNT(*)
    FROM
        data,
        json_array_elements(json_array) elems,   -- 1
        json_each_text(elems) each               -- 2
    GROUP BY each.value                          -- 3