我有这个 jsonb 数据格式-
data
{"20161110" : {"6" : ["12", "11", "171.00"],"12" : ["13", "11", "170.00"],"18" : ["16", "11", "174.00"]}}
我想从价格中找出最小值, 在本例中为 170.00 。 我已尝试编制索引,但能够找到特定术语 (6、12、18) 的数据,但不是其中的最小值。
What I have tried-
data::json->(select key from json_each_text(data::json) limit 1))::json#>>'{6,2}'
第 6 学期的结果是 171.00
最佳答案
如果您想要数组中第三个元素的最小值,那么您将不得不解压 JSON 文档以获取数组以比较值。这有点像这样(假设您确实有一个 jsonb
列和一个名为 id
的主键):
SELECT id, min((arr ->> 2)::numeric) AS min_price
FROM ( SELECT id, jdoc
FROM my_table, jsonb_each(data) d (key, jdoc) ) sub,
jsonb_each(jdoc) doc (key, arr)
GROUP BY 1;
在 PostgreSQL 中有表函数,返回一组行的函数,如 jsonb_each()
。您应该在 FROM 列表中使用这些函数。这些表函数可以隐式引用列表中前面定义的表中的列,例如 FROM my_table, jsonb_each(my_table.data)
,在这种情况下,两个源之间的链接就像连接条件一样在两者之间指定;实际上,该函数会针对源表的每一行调用一次,并将函数输出添加到可用列的列表中。
JSON 函数仅适用于明确指定的 JSON 文档级别。这可能是整个文档(在本例中为 my_table.data
)或向下到您可以指定的某个路径。我在这里假设第一个键是日期值,因此您事先不知道该键。子文档也是如此。在这些情况下,您可以使用 jsonb_each()
等函数。您显然知道确切的数组位置,因此您只需索引数组即可找到价格信息。请注意,这些显然也是 JSON 格式,因此您应该使用 ->>
运算符将价格作为 text
值,然后将其转换为 numeric
这样您就可以将它提供给 min()
函数。
关于json - 如何使用 postgres 在 jsonb 数据中找到最小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603600/