有没有办法检查范围数组是否在 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));