【问题标题】:How to filter json array per each returned row?如何为每个返回的行过滤 json 数组?
【发布时间】:2020-05-15 18:05:34
【问题描述】:

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

例如对于行:

id = 1, jsonColumn = [{ field: 'abc' },{ field: 'def' },{ field: 'ghi' }]
id = 2, jsonColumn = [{ field: 'abc' },{ field: '123' },{ field: '456' }]
id = 3, jsonColumn = [{ field: 'abc' },{ field: '789' },{ field: 'XXX' }]

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

【问题讨论】:

  • 谁说这是个问题?这只是一个任务,用postgresql很容易完成。
  • 我的 jsonb 格式看起来像这样 {"key1":[ {"new":"(888) 888 8888","old":"(999) 999 9999","field": "sec_phone"}, {"new":"(888) 888 8888","old":"(999) 999 9999","field":"sec_phone"} ] } 我想根据我得到的新字段进行搜索下面提到的查询中的错误请帮助

标签: postgresql


【解决方案1】:

您可以使用json_array_elements 取消嵌套 JSON,并在过滤后使用array_agg 将其嵌套回去。像这样的:

SELECT t.id, array_to_json(array_agg(j))
FROM your_table t, json_array_elements(t.jsonColumn) j
WHERE j->>'field' = 'abc'
GROUP BY id;

【讨论】:

  • 我的 jsonb 格式看起来像这样 {"key1":[ {"new":"(888) 888 8888","old":"(999) 999 9999","field": "sec_phone"}, {"new":"(888) 888 8888","old":"(999) 999 9999","field":"sec_phone"} ] } 我想根据我得到的新字段进行搜索此查询中的错误请帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2021-08-12
  • 2020-03-19
  • 2019-04-23
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多