SELECT *
FROM parents p
WHERE EXISTS (
SELECT FROM jsonb_array_elements(p.children) c
WHERE (c->>'age')::int BETWEEN 10 AND 12
);
EXISTS
当多个数组对象匹配时,半联接避免了中间表中行的重复-以及DISTINCT ON
在外部查询中的需要。但这只是稍微快一点。
核心问题是您想测试 整数值范围 ,而现有的jsonb
运算符不提供此类功能。
有多种解决方法。不知道这些,这里有一个“智能”解决方案可以解决给定的示例。诀窍是将范围划分为不同的值,并使用jsonb
container运算符@>
:
SELECT *
FROM parents p
WHERE (p.children @> '[{"age": 10}]'
OR p.children @> '[{"age": 11}]'
OR p.children @> '[{"age": 12}]');
由jsonb_path_ops
GIN索引支持:
CREATE INDEX parents_children_gin_idx ON parents USING gin (children jsonb_path_ops);
但是,如果您的范围跨越了一个不完整的整数值,那么您将需要一些更通用的东西。与 往常一样 ,最佳解决方案取决于整体情况:数据分布,值频率,查询中的典型范围,可能为NULL值,行大小,读/写模式, 每个jsonb
值都具有一个或多个匹配age
键吗?…