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

标签 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 数组中的所有值,但我理想的查询最终结果类似于:

值(value) |数量
--------------
值 1 | 48
值2 | 112
值3 | 93
值4 | 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. 按新值列/计数分组

关于arrays - 如何将 PostgreSQL 中带有 JSON 数组字段的表解析为行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56275199/

相关文章:

ios - 将 byte[] 转换为 NSData 后数据损坏

javascript - 无法使用 jQuery 正确打印 JSON 数组中的数据

java - 在Java中解析JSON数组

postgresql - 使用 Anorm 在 PostgreSQL 中插入图像文件

javascript - d3 处理多个数组中的数据

c++ - 类 C++ 的静态(单个实例)数组

java - 从 Java 中的 jpa 注释更改表

python - SQLAlchemy:运算符 LIKE 和自定义类型

ruby-on-rails - 如何在 Rails 上的 postgres/ruby 上查询嵌套 json 属性

json - 在 NodeJs 中读取 JSON 时,对象为 null