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

时间:2018-09-23 16:54:16

标签: postgresql range

在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

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

1 个答案:

答案 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));