假设表json_table
的列为id (int), data (jsonb)
。样本jsonb值将是
{"a": [{"b":{"c": "xxx", "d": 1}},{"b":{"c": "xxx", "d": 2}}]}
当我使用如下所示的SQL语句时:
SELECT data FROM json_table j, jsonb_array_elements(j.data#>'{a}') dt WHERE (dt#>>'{b,d}')::integer NOT IN (2,4,6,9) GROUP BY id;
...这两个数组元素是未嵌套的,但仍返回限定WHERE子句的元素。这是有道理的,因为每个数组元素都是单独考虑的。在此示例中,我将返回完整的行
{"a": [{"b":{"c": "xxx", "d": 1}},{"b":{"c": "xxx", "d": 2}}]}
我正在寻找一种在任何jsonb数组元素不满足条件时排除完整json_table
行的方法
您可以将条件移到WHERE
子句并使用NOT EXISTS
:
SELECT data
FROM json_table j
WHERE NOT EXISTS (SELECT 1
FROM jsonb_array_elements(j.data#>'{a}') dt
WHERE (dt#>>'{b,d}')::integer IN (2, 4, 6, 9)
);
您可以通过以下查询来实现:
select data
from json_table
where jsonb_path_match(data, '!exists($.a[*].b.d ? ( @ == 2 || @ == 4 || @ == 6 || @ == 9))')