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

PostgreSQL: exclude complete jsonb array if one element fails the WHERE clause

假设 table json_tableid (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))')