范围类型检查的 postgres 数组包括



有没有办法检查范围数组是否在 postgres 中包含另一个范围数组

create table t(f int4range[])
insert into t values(array[int4range(1, 3), int4range(5,8)]);

select * from t where myincludes(f, array[int4range(1,2), int4range(5,6)]

此 SQL 将返回数据:

| [NumericRange(1, 3, '[)'), NumericRange(5, 8, '[)')] |
+------------------------------------------------------+

数组长度可能不同。 但范围不会重叠。

我可以想出的一种方法是循环遍历参数,然后检查是否有任何范围包含这样的参数:

for i in arguments:
contains := false
for j in data:
if j contains i:
contains = true
break // check the next argument
if contains == false:
return false

但我想知道是否有另一种方法可以实现这一点。 谢谢!

您可以unnest()并联接两个数组。如果该结果中有一对,其中一个范围不包含另一个范围,要检查这一点,您可以使用@>运算符,它不是匹配项。您可以在外部查询WHERE子句中使用NOT EXISTS来检查是否存在这样的对。

SELECT *
FROM t
WHERE NOT EXISTS (SELECT *
FROM unnest(f) WITH ORDINALITY un1(f, o)
FULL JOIN unnest(array[int4range(1,2), int4range(5,6)]) WITH ORDINALITY un2(f, o)
ON un2.o = un1.o
WHERE NOT coalesce(un1.f @> un2.f, false));

相关内容

  • 没有找到相关文章

最新更新