postgresql - 使用 PostgreSQL 从可变长度的 json 列表中选择最大数

标签 postgresql

我的数据库中有一个列(我们称之为 jsn),其中包含 json 对象(出于某些原因实际上存储为纯文本)。这个 json 对象看起来像这样:

{"a":
    {"b":[{"num":123, ...},
          {"num":456, ...},
          ...,
          {"num":789, ...}],
     ...
    },
 ...
}

我对对象“a”内的对象“b”列表中最大的“num”感兴趣。 如果列表的长度已知,我可以这样做:

SELECT
    GREATEST((jsn::json->'a'->'b'->>0)::int,
             (jsn::json->'a'->'b'->>1)::int,
             ... ,
             (jsn::json->'a'->'b'->>N)::int))
FROM table

请注意,我是 PostgreSQL(以及一般的数据库查询!)的新手,所以这可能是一种垃圾方式。无论如何它都有效。 我想不通的是,当列表“b”的长度为任意且未知时,如何进行这项工作。

如果相关,我使用托管在 AWS RDS 上的 PostgreSQL 10 并使用 pgAdmin 4 运行查询。

最佳答案

您需要取消嵌套数组,然后您可以对结果应用 max():

select max((n.x -> 'num')::int)
from the_table t
  cross join jsonb_array_elements(t.jsn::jsonb -> 'a' -> 'b') as n(x);

你可能想添加一个group by,这样你就可以区分最大值来自哪一行。假设您的表中有一列 id 是唯一的:

select id, max((n.x -> 'num')::int)
from the_table t
  cross join jsonb_array_elements(t.jsn::jsonb -> 'a' -> 'b') as n(x)
group by id;

关于postgresql - 使用 PostgreSQL 从可变长度的 json 列表中选择最大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55121681/

相关文章:

SQL 查询从多个表中获取不同的行

django - 撤消密集数据库中的级联删除

sql - 行间时间差之和

node.js - 在 Node.js 中为 postgres 表中的每一行以每行的不同间隔运行重复任务

sql - 编译器将订单表读取为 ORDER 命令

sql - 仅选择更改的行

sql - 有没有办法优化 SQL 选择中的子查询数组?

python - 从架构中的每个表中获取所有单列

php - 使用 Laravel 上传和显示保存在 PostgreSQL 中的 PDF 文件

postgresql - 如何更改postgres中的日期格式?