arrays - 如何按特定顺序连接 JSON 数组的两个值?

标签 arrays json postgresql concatenation aggregate

我正在使用 PostgreSQL 9.5。我有一个包含 JSON 数组的表,其中包含以下格式的 JSON 对象:

[]
[{animal:cat}, {plant:sunflower}, {car:mercedes}]
[{animal:dog}]
[{animal:dog}, {car:audi}]
[]

我需要输出一个表格,将animalplant的值组合起来,然后计算每个键值组合的数量。需要忽略空值,但只有动物植物的情况也被分组为它们自己的组。 汽车 需要完全移除。

我理想的最终结果是这样的:

Animal : Plant     |  Amount
---------------------------
cat : oak          |   54
cat : sunflower    |   127
dog                |   8
cow : oak          |   3
...

我尝试过的:

SELECT
    ((json_array_elements(Table.json_array)::JSONB
- 'car')::JSON#>>'{animal}')::TEXT AS elems,
    count(*)
FROM    Table
GROUP BY elems

我可以看到这给了我 animal 作为一个字符串并计算它的每个实例。我还可以通过将 JSON 数组转换为 JSONB 来删除 car,然后使用减号运算符删除 car,然后转换回 JSON。不过转换为 JSONB 会改变我的值的顺序。

但是当我尝试连接来自animalplant 的字符串时:

SELECT
    (((json_array_elements(Table.json_array))::JSON#>>'{animal}') || ' : ' || ((json_array_elements(Table.json_array))::JSON#>>'{plant}'))
    ::TEXT AS elems,
    count(*)
FROM    Table
GROUP BY elems

我收到错误信息:

functions and operators can take at most one set argument

尝试了json_aggCONCAT()||,结果相同。

我试图弄清楚如何将动物植物的一面作为集合以外的东西来类型转换,但到目前为止没有取得进展。

如何得到想要的结果?当我通过数据可视化程序 Apache superset 使用数据库时,我只能使用 Postgres 命令。

最佳答案

一种方式:

SELECT animal_plant, count(*)
FROM  (
   SELECT t.id, concat_ws(' : '
                        , string_agg(elem ->> 'animal', '|')
                        , string_agg(elem ->> 'plant' , '|')) AS animal_plant
   FROM   tbl t, json_array_elements(t.json_array) j(elem)
   GROUP  BY t.id
   ) sub
GROUP  BY 1
ORDER  BY 1;

这会连接来自相同 JSON 值的所有猫和所有狗,因为您没有透露是否可以有多个。 (如果每个最多有一个,它会产生您想要的结果。)

db<> fiddle here

在 Postgres 12 中使用 SQL/JSON 可能会变得更简单 ...
(无论如何,您需要尽快升级到现代版本的 Postgres。)

关于arrays - 如何按特定顺序连接 JSON 数组的两个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444545/

相关文章:

arrays - Swift - 具有特定类类型的数组

python - 具有多个条件的数组索引操作

java - 在 Jersey 2 中流式传输?

javascript - 我想将 JSON 对象的特定内容显示到表结构中?我怎样才能做到这一点?

java - 从 ArrayAdapter 中删除项目

arrays - 如何在 typescript 中将数组插入另一个非空数组?如果需要的话加入

javascript - JSON 对象中不可预测的层次结构

ruby-on-rails - rake 数据库 :create gives error on server

node.js - 使用 Node 插入 JSON 对象 postgres,无需 for 每个 db.query 循环

sql - postgres 中的子查询或连接联合?