PostgreSQL:如果一个元素未通过WHERE子句,则排除完整的jsonb数组

问题描述 投票:0回答:2

假设表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行的方法

sql json postgresql jsonb postgresql-9.4
2个回答
0
投票

您可以将条件移到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)
                 );

0
投票

您可以通过以下查询来实现:

select data 
from json_table
where jsonb_path_match(data, '!exists($.a[*].b.d ? ( @ == 2 || @ == 4 || @ == 6 || @ == 9))') 
© www.soinside.com 2019 - 2024. All rights reserved.