如何过滤每个返回行的json数组?

use*_*521 13 postgresql

我有一个带有 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' }]
Run Code Online (Sandbox Code Playgroud)

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

max*_*kin 19

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

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;
Run Code Online (Sandbox Code Playgroud)