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