Postgres массив проверки типа диапазона включает - PullRequest
0 голосов
/ 23 сентября 2018

Есть ли способ проверить, включает ли массив диапазона другой массив диапазона в 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 голосов
/ 23 сентября 2018

Вы можете 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...