我有一个带有 JSON 列的表。 JSON 列为每一行保存一个包含 JSON 对象的 JSON 数组,如下所示
[{"my_value": 42, "category": "A"}, {"my_value": 100, "category": "C"}, {"my_value": 15, "category": "B"}, {"my_value": 123, "category": "D"}]
我想从表中选择所有行,但只选择 JSON 列中与条件匹配的部分(category='B'),这样在这种情况下我会得到 JSON 对象
{"my_value": 15, "category": "B"}
请注意包含类别 B 的 JSON 对象可以存在于任何索引中
SELECT jsonb_array_elements(your_json_colum) AS json_obj
FROM your_table
WHERE jsonb_array_elements(your_json_colum)->>'category' = 'B';
此查询将从类别为“B”的 JSON 列中的数组中获取 JSON 对象。
这看起来效率非常低,但你可以使用 JSON_TABLE 将数组转换为行:
SELECT test.id, temp.obj
FROM test
LEFT JOIN
JSON_TABLE(
json_data,
'$[*]' COLUMNS(
obj JSON PATH '$',
NESTED PATH '$.category' COLUMNS (category CHAR(1) PATH '$')
)
) AS temp ON temp.category = 'B';
这是一个小提琴