9.20. Диапазонные функции и операторы

Диапазонные типы данных рассматриваются в Разделе 8.17.

В Таблице 9.53 показаны имеющиеся специальные операторы для диапазонных типов. Кроме них для диапазонов определены обычные операторы сравнения, показанные в Таблице 9.1. Операторы сравнения сначала сравнивают нижние границы диапазонов, и только если они равны, сравнивают верхние границы. Такие операторы сравнения обычно не помогают получить полезный в целом вариант сортировки, но позволяют строить по диапазонам уникальные индексы.

Таблица 9.53. Диапазонные операторы

Оператор

Описание

Пример(ы)

anyrange @> anyrangeboolean

Первый диапазон содержит второй?

int4range(2,4) @> int4range(2,3)t

anyrange @> anyelementboolean

Диапазон содержит заданный элемент?

'[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestampt

anyrange <@ anyrangeboolean

Первый диапазон содержится во втором?

int4range(2,4) <@ int4range(1,7)t

anyelement <@ anyrangeboolean

Заданный элемент содержится в диапазоне?

42 <@ int4range(1,7)f

anyrange && anyrangeboolean

Диапазоны пересекаются (у них есть общие элементы)?

int8range(3,7) && int8range(4,12)t

anyrange << anyrangeboolean

Первый диапазон располагается строго слева от второго?

int8range(1,10) << int8range(100,110)t

anyrange >> anyrangeboolean

Первый диапазон располагается строго справа от второго?

int8range(50,60) >> int8range(20,30)t

anyrange &< anyrangeboolean

Первый диапазон не простирается правее второго?

int8range(1,20) &< int8range(18,20)t

anyrange &> anyrangeboolean

Первый диапазон не простирается левее второго?

int8range(7,20) &> int8range(5,10)t

anyrange -|- anyrangeboolean

Диапазоны примыкают друг к другу?

numrange(1.1,2.2) -|- numrange(2.2,3.3)t

anyrange + anyrangeanyrange

Вычисляет объединение диапазонов. Диапазоны должны пересекаться или касаться друг друга, чтобы их объединением был один диапазон (но см. range_merge()).

numrange(5,15) + numrange(10,20)[5,20)

anyrange * anyrangeanyrange

Вычисляет пересечение диапазонов.

int8range(5,15) * int8range(10,20)[10,15)

anyrange - anyrangeanyrange

Вычисляет разность диапазонов. При этом второй диапазон, если он содержится в первом, должен располагаться так, чтобы в результате его вычитания получался один диапазон.

int8range(5,15) - int8range(10,20)[5,10)


Операторы слева/справа/примыкает всегда возвращают false, если один из диапазонов пуст; то есть, считается, что пустой диапазон находится не слева и не справа от какого-либо другого диапазона.

В Таблице 9.54 перечислены функции, предназначенные для работы с диапазонными типами.

Таблица 9.54. Диапазонные функции

Функция

Описание

Пример(ы)

lower ( anyrange ) → anyelement

Выдаёт нижнюю границу диапазона (NULL, если диапазон пуст или нижняя граница не является конечной).

lower(numrange(1.1, 2.2))1.1

upper ( anyrange ) → anyelement

Выдаёт верхнюю границу диапазона (NULL, если диапазон пуст или верхняя граница не является конечной).

upper(numrange(1.1, 2.2))2.2

isempty ( anyrange ) → boolean

Диапазон пуст?

isempty(numrange(1.1,2.2))f

lower_inc ( anyrange ) → boolean

Нижняя граница диапазона включается в него?

lower_inc(numrange(1.1, 2.2))t

upper_inc ( anyrange ) → boolean

Верхняя граница диапазона включается в него?

upper_inc(numrange(1.1, 2.2))f

lower_inf ( anyrange ) → boolean

Нижняя граница диапазона бесконечна?

lower_inf('(,)'::daterange)t

upper_inf ( anyrange ) → boolean

Верхняя граница диапазона бесконечна?

upper_inf('(,)'::daterange)t

range_merge ( anyrange, anyrange ) → anyrange

Вычисляет наименьший диапазон, включающий оба заданных диапазона.

range_merge('[1,2)'::int4range, '[3,4)'::int4range)[1,4)


Если функциям lower_inc, upper_inc, lower_inf, upper_inf передаётся пустой диапазон, они возвращают false.