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