我有这种jsonb数据格式 -
数据
{"20161110" : {"6" : ["12", "11", "171.00"],"12" : ["13", "11", "170.00"],"18" : ["16", "11", "174.00"]}}
我想找出价格中的最小值, 在这种情况下 - 170.00。 我尝试过索引,但能够找到特定术语的数据(6,12,18),但不是最小的数据。
我尝试了什么 -
data::json->(select key from json_each_text(data::json) limit 1))::json#>>'{6,2}'
这给了我第六个学期的结果,即171.00
答案 0 :(得分:1)
如果您想要数组中第三个元素的最小值,那么您必须解压缩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()
{1}}功能。
答案 1 :(得分:0)
我为此创建了此功能。希望对您有帮助
CREATE
OR
replace FUNCTION min_json (data json)
returns numeric AS $$
BEGIN
RETURN
(
SELECT Min(value)
FROM (
SELECT (Hstore(Json_each_text(data))->'value')::numeric AS value) AS t);
END;
$$ language plpgsql;