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

时间:2019-05-23 12:25:54

标签: arrays json postgresql


我有一个包含json数组的表。以下是该字段内容的样本:

SELECT json_array FROM table LIMIT 5;

结果:

  

[{{“ key1”:“ value1”},{“ key1”:“ value2”},...,{“ key2”:“ value3”}]
  []
  []
  [] {“ key1”:“ value1”}
  []

如何获取所有值并计算找到的每个值有多少?

我正在使用PostgreSQL 9.5.14,并且在这里Querying a JSON array of objects in Postgres尝试了解决方案 以及另一个慷慨的stackoverflow用户在我的最后一个问题中向我提出的建议:How can I parse JSON arrays in postgresql?

我尝试过:

SELECT 
    value -> 'key1'
FROM
    table,
    json_array_elements(json_array);

可惜由于收到错误而对我不起作用:
无法在标量上调用json_array_elements
This error happens when using a query that returns more than one row or more than one column as a scalar subquery.

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

SELECT json_array as json, (json_array->0), 
  coalesce(
    case
      when (json_array->0) IS NULL then null
      else (json_array->0->>'key1')
    end,
  'No value') AS "Value"
FROM table;

仅返回“值”的空值

引用Querying a JSON array of objects in Postgres时,我也尝试使用此解决方案:

WITH json_test (col) AS (
values (json_arrays)
)
SELECT
  y.x->'key1' "key1"
FROM json_test jt, 
LATERAL (SELECT json_array_elements(jt.col) x) y;

但是我需要能够将json_arrays的所有元素放入json_test

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

值|金额
---------------
value1 | 48
value2 | 112
value3 | 93
value4 | 0

再次感谢您的帮助,在此先感谢您。

1 个答案:

答案 0 :(得分:0)

step-by-step demo:db<>fiddle

SELECT
    each.value,
    COUNT(*)
FROM
    data,
    json_array_elements(json_array) elems,   -- 1
    json_each_text(elems) each               -- 2
GROUP BY each.value                          -- 3
  1. 将每个数组元素的数组扩展为一行
  2. 将键/值对分为两列
  3. 按新值列/计数分组