Sql 从JSON字段的列表列表中查询

Sql 从JSON字段的列表列表中查询,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,我在postgresql中有一个表,其中包含JSON列表,其中的每个元素也是一个列表(它可以是字典,尽管我决定将其设为列表或元组) 以下是一个例子: +---------------------------------------------------+ | [["status", 10], ["status", 20]] | +---------------------------------------------------+ | [["extra",

我在postgresql中有一个表,其中包含JSON列表,其中的每个元素也是一个列表(它可以是字典,尽管我决定将其设为列表或元组)

以下是一个例子:

+---------------------------------------------------+
| [["status", 10], ["status", 20]]                  |
+---------------------------------------------------+
| [["extra", 21], ["status", 15]]                   |
+---------------------------------------------------+
| [["value", 33]]                                   |
+---------------------------------------------------+
| [["extra", 21], ["status", 15], ["feature", 11]]  |
+---------------------------------------------------+
我想找到最大状态,例如第零个元素应该等于“状态”,并得到第一个元素的最大值。 到目前为止,我无法提取数据,以下是我尝试过的:

SELECT value->0 FROM jsonb_array_elements((SELECT items::jsonb FROM mytable LIMIT 1));
通过此查询,我可以展开第一行(限制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]] ]'
)));
有人能帮我扩展/展平价值吗

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数据格式有点奇怪。更自然的方法是,例如,
[{“状态”:10},{“状态”:20}]

然而,json数据格式有点奇怪。更自然的方法是,例如,
[{“status”:10},{“status”:20}]

谢谢你——工作起来很有魅力!我同意这种格式有点奇怪。我们的dba说使用元组而不是dict可以节省一点空间。字段的数量超过2个,我们预计每个记录中最多有100项。我的第一个方法是使用另一张桌子,但后来我们决定使用jsonb。谢谢你——工作起来很有魅力!我同意这种格式有点奇怪。我们的dba说使用元组而不是dict可以节省一点空间。字段的数量超过2个,我们预计每个记录中最多有100项。我的第一个方法是使用另一个表,但后来我们决定使用jsonb。