我的数据库中有一个列(我们称之为 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/