在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
但是我想知道是否还有另一种方法可以实现这一目标。 谢谢!
答案 0 :(得分:0)
您可以unnest()
并加入两个数组。如果结果中有一对,其中一个范围不包含另一个,要检查这一点,可以使用@>
运算符,这不是匹配项。您可以在外部查询NOT EXISTS
子句中使用WHERE
来检查是否没有这样的配对。
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));