如何从 PostgreSQL 多范围中提取与另一个范围重叠的范围?

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

我想使用 SQL 从多范围中提取与另一个范围重叠的范围。

例如,

{[5,10), [14,20), [26,28), [29,31)}
{[15,27)}
应得到
{[14,20), [26,28)}

我可以用

unnest
range_agg
来实现这一点:

select range_agg(t.v) from (select unnest(:ranges) v) t where t.v && :range;

但是它的性能似乎很差。您有什么想法以更有效的方式做到这一点吗?

PS。我希望有这样的

&
运算符:

{[5,10), [14,20), [26,28), [29,31)} & {[15,27)} -> {[14,20), [26,28)}
sql postgresql postgresql-performance
1个回答
0
投票

有用于多范围的交集运算符

*
:

SELECT int4multirange '{[5,10), [14,20), [26,28), [29,31)}' * int4multirange '{[15,27)}';

但是只返回实际的重叠,而您希望每个重叠范围都完整。为此,您的查询已经是最好的了。

根据实际使用的查询,可能需要进行额外的调整来提高性能 - 例如首先使用索引支持过滤重叠范围。

© www.soinside.com 2019 - 2024. All rights reserved.