首页 > 解决方案 > 如何在 Postgresql 中为每个返回的行过滤 json 数组

问题描述

如果对象结构是这样的,你能帮我吗?

我有一个带有 JSON 字段的表,其中存储了一个对象数组。我想查询这个表,并且对于每个返回的行,通过使用某些条件过滤它们,只返回 json 数组对象的子集。

例如对于行:

id = 1, jsonColumn = [{ field: 'abc', Observation: [Value: 'Value1'] },{ field: 'def', Observation: [Value: 'Value2'] },{ field: 'ghi, Observation: [Value: 'Value3']' }]
id = 2, jsonColumn = [{ field: 'pqr', Observation: [Value: 'Value1'] },{ field: 'aaa', Observation: [Value: 'Value2'] },{ field: 'ccc, Observation: [Value: 'Value3']' }]
id = 3, jsonColumn = [{ field: 'www', Observation: [Value: 'Value1'] },{ field: 'qqq', Observation: [Value: 'Value2'] },{ field: 'rrr', Observation: [Value: 'Value3']' }]

我想选择所有行,并且每行应仅包含在 jsonColumn 中 field = 'abc' 和 Value = 'Value1' 的元素。我只想过滤此列,而不是返回包含数组中特定元素的行...

标签: sqljsonpostgresql

解决方案


您可以使用子选择json_array_elements,然后将其聚合回数组

SELECT
  id,
  ( SELECT json_agg(element)
    FROM json_array_elements(json_column) element
    WHERE … -- e.g. element -> 'field' = …
  ) AS filtered_json_column
FROM
  table

推荐阅读