从JSON字段列表中查询

时间:2017-05-19 12:13:37

标签: sql postgresql jsonb

我在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]] ]'
)));

有人可以帮助我扩展/压扁价值观吗?

1 个答案:

答案 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}]