9.20. Диапазонные функции и операторы
Диапазонные типы данных рассматриваются в Разделе 8.17.
В Таблице 9.53 показаны имеющиеся специальные операторы для диапазонных типов. Кроме них для диапазонов определены обычные операторы сравнения, показанные в Таблице 9.1. Операторы сравнения сначала сравнивают нижние границы диапазонов, и только если они равны, сравнивают верхние границы. Такие операторы сравнения обычно не помогает получить полезный в целом вариант сортировки, но позволяют строить по диапазонам уникальные индексы.
Таблица 9.53. Диапазонные операторы
| Оператор Описание Пример(ы) | 
|---|
| anyrange@>anyrange→boolean
 Первый диапазон содержит второй? int4range(2,4) @> int4range(2,3)→t
 | 
| anyrange@>anyelement→boolean
 Диапазон содержит заданный элемент? '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp→t
 | 
| anyrange<@anyrange→boolean
 Первый диапазон содержится во втором? int4range(2,4) <@ int4range(1,7)→t
 | 
| anyelement<@anyrange→boolean
 Заданный элемент содержится в диапазоне? 42 <@ int4range(1,7)→f
 | 
| anyrange&&anyrange→boolean
 Диапазоны пересекаются (у них есть общие элементы)? int8range(3,7) && int8range(4,12)→t
 | 
| anyrange<<anyrange→boolean
 Первый диапазон располагается строго слева от второго? int8range(1,10) << int8range(100,110)→t
 | 
| anyrange>>anyrange→boolean
 Первый диапазон располагается строго справа от второго? int8range(50,60) >> int8range(20,30)→t
 | 
| anyrange&<anyrange→boolean
 Первый диапазон не простирается правее второго? int8range(1,20) &< int8range(18,20)→t
 | 
| anyrange&>anyrange→boolean
 Первый диапазон не простирается левее второго? int8range(7,20) &> int8range(5,10)→t
 | 
| anyrange-|-anyrange→boolean
 Диапазоны примыкают друг к другу? numrange(1.1,2.2) -|- numrange(2.2,3.3)→t
 | 
| anyrange+anyrange→anyrange
 Вычисляет объединение диапазонов. Диапазоны должны пересекаться или касаться друг друга, чтобы их объединением был один диапазон (но см. range_merge()). numrange(5,15) + numrange(10,20)→[5,20)
 | 
| anyrange*anyrange→anyrange
 Вычисляет пересечение диапазонов. int8range(5,15) * int8range(10,20)→[10,15)
 | 
| anyrange-anyrange→anyrange
 Вычисляет разность диапазонов. При этом второй диапазон, если он содержится в первом, должен располагаться так, чтобы в результате его вычитания получался один диапазон. 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.