繁体   English   中英

从 json 数组 object postgres 中获取值

[英]Get value from json array object postgres

我有一个这样的查询:

SELECT tags
FROM (
    SELECT trm.dado_id
        , json_agg(json_build_object('field',trm.nome, 'value',trm.valor)) AS tags
    FROM tb_dados trm
    JOIN tb_table1 t on trm.dado_id = t.id
    WHERE t.id = trm.dado_id
    GROUP BY trm.dado_id
    ) tabletags;

它返回了很多带有 json 数组字段的行,如下所示:

1  |   [{"field" : "EMISSION", "value" : "21/04/2020 00:38:00"}, {"field" : "DATA CREATION", "value" : "21/09/1989"}, {"field" : "SERIE NUMBER", "value" : "00.000.000-11"}]
2  |   [{"field" : "DATA CREATION", "value" : "21/09/1998"}, {"field" : "SERIE NUMBER", "value" : "00.000.000-7"}]
3  |   [{"field" : "EMISSION", "value" : "21/04/2020 00:38:00"}, {"field" : "DATA CREATION", "value" : "21/09/1989"}, {"field" : "SERIE NUMBER", "value" : "00.000.000-7"}]
4  |   [{"field" : "EMISSION", "value" : "21/04/2020 00:38:00"}, {"field" : "DATA CREATION", "value" : "21/09/1989"}, {"field" : "SERIE NUMBER", "value" : "00.000.000-11"}]

...

好吧,我想查询序列号等于 00.000.000-11 的行。 有办法过滤吗?

您可以使用HAVING子句过滤聚合查询。 另请注意,此处不需要子查询,并且WHERE子句与JOINON子句重复。

所以:

SELECT json_agg(json_build_object('field', trm.nome, 'value', trm.valor)) AS tags
FROM tb_dados trm
JOIN tb_table1 t on trm.dado_id = t.id
GROUP BY trm.dado_id
HAVING bool_or(trm.nome = 'SERIE NUMBER' AND trm.valor = '00.000.000-11')

旁注:您使用json而不是jsonb有什么原因吗? 后者提供了更多的功能,通常应该是首选。 您可以使用jsonb_build_objet()jsonb_agg()代替相应的json_*函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM