【问题标题】:Get value from json array object postgres从 json 数组对象 postgres 中获取值
【发布时间】:2020-09-28 01:20:55
【问题描述】:

我有一个这样的查询:

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 的行。 有办法过滤吗?

【问题讨论】:

    标签: sql arrays json postgresql select


    【解决方案1】:

    您可以使用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_* 函数。

    【讨论】:

    • 感谢您的回答。但是通过有子句过滤,我怎样才能确保这个“valor”与这个“nome”完全匹配?
    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多