我在postgresql中有一个表,其中包含JSON列表,每个元素也是一个列表(虽然我决定将它列为列表或元组,但它可能是字典)。
以下是一个例子:
+---------------------------------------------------+
| [["status", 10], ["status", 20]] |
+---------------------------------------------------+
| [["extra", 21], ["status", 15]] |
+---------------------------------------------------+
| [["value", 33]] |
+---------------------------------------------------+
| [["extra", 21], ["status", 15], ["feature", 11]] |
+---------------------------------------------------+
我想找到最高状态,例如第零个元素应该等于" status"并获得第一个元素的最大值。 到目前为止,我无法提取数据,这是我尝试过的:
SELECT value->0 FROM jsonb_array_elements((SELECT items::jsonb FROM mytable LIMIT 1));
使用此查询我可以展开第一行( LIMIT 1 ),删除限制会给我一个错误:
ERROR: more than one row returned by a subquery used as an expression
我相信你可以通过下一个查询模仿我的情况:
select * from json_array_elements((select * from json_array_elements(
'[ [["status", 10], ["status", 20]], [["extra", 21], ["status", 15]], [["value", 33]], [["extra", 21], ["status", 15], ["feature", 11]] ]'
)));
有人可以帮助我扩展/压扁价值观吗?
答案 0 :(得分:2)
with my_table(items) as (
values
('[["status", 10], ["status", 20]]'::jsonb),
('[["extra", 21], ["status", 15]]'),
('[["value", 33]]'),
('[["extra", 21], ["status", 15], ["feature", 11]]')
)
select max((value->>1)::int)
from (
select value
from my_table,
jsonb_array_elements(items)
where value->>0 = 'status'
) s;
max
-----
20
(1 row)
然而,json数据格式有点奇怪。更自然的方法是例如[{"status": 10}, {"status": 20}]
。