PostgreSQL:如果一个元素未通过 WHERE 子句,则排除完整的 jsonb 数组
PostgreSQL: exclude complete jsonb array if one element fails the WHERE clause
假设 table 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))')
假设 table 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))')