9.19. Диапазонные функции и операторы
Диапазонные типы данных рассматриваются в Разделе 8.17.
В Таблице 9.50 показаны операторы, предназначенные для работы с диапазонами.
Таблица 9.50. Диапазонные операторы
| Оператор | Описание | Пример | Результат | 
|---|---|---|---|
| = | равно | int4range(1,5) = '[1,4]'::int4range | t | 
| <> | не равно | numrange(1.1,2.2) <> numrange(1.1,2.3) | t | 
| < | меньше | int4range(1,10) < int4range(2,3) | t | 
| > | больше | int4range(1,10) > int4range(1,5) | t | 
| <= | меньше или равно | numrange(1.1,2.2) <= numrange(1.1,2.2) | t | 
| >= | больше или равно | numrange(1.1,2.2) >= numrange(1.1,2.0) | t | 
| @> | содержит диапазон | int4range(2,4) @> int4range(2,3) | t | 
| @> | содержит элемент | '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp | t | 
| <@ | диапазон содержится в | int4range(2,4) <@ int4range(1,7) | t | 
| <@ | элемент содержится в | 42 <@ int4range(1,7) | f | 
| && | пересекает (есть общие точки) | int8range(3,7) && int8range(4,12) | t | 
| << | строго слева от | int8range(1,10) << int8range(100,110) | t | 
| >> | строго справа от | int8range(50,60) >> int8range(20,30) | t | 
| &< | не простирается правее | int8range(1,20) &< int8range(18,20) | t | 
| &> | не простирается левее | int8range(7,20) &> int8range(5,10) | t | 
| -|- | примыкает к | numrange(1.1,2.2) -|- numrange(2.2,3.3) | t | 
| + | union | numrange(5,15) + numrange(10,20) | [5,20) | 
| * | пересечение | int8range(5,15) * int8range(10,20) | [10,15) | 
| - | вычитание | int8range(5,15) - int8range(10,20) | [5,10) | 
Простые операторы сравнения <, >, <= и >= сначала сравнивают нижние границы, и только если они равны, сравнивают верхние. Эти операторы сравнения обычно не очень полезны для диапазонов; основное их предназначение — сделать возможным построение индексов-B-деревьев по диапазонам.
Операторы слева/справа/примыкает всегда возвращают false, если один из диапазонов пуст; то есть, считается, что пустой диапазон находится не слева и не справа от какого-либо другого диапазона.
Операторы сложения и вычитания вызывают ошибку, если получающийся в результате диапазон оказывается состоящим из двух разделённых поддиапазонов, так как его нельзя представить в этом типе данных.
В Таблице 9.51 перечислены функции, предназначенные для работы с диапазонными типами.
Таблица 9.51. Диапазонные функции
| Функция | Тип результата | Описание | Пример | Результат | 
|---|---|---|---|---|
|  | тип элемента диапазона | нижняя граница диапазона | lower(numrange(1.1, 2.2)) | 1.1 | 
|  | тип элемента диапазона | верхняя граница диапазона | upper(numrange(1.1, 2.2)) | 2.2 | 
|  | boolean | диапазон пуст? | isempty(numrange(1.1,2.2)) | false | 
|  | boolean | нижняя граница включается? | lower_inc(numrange(1.1, 2.2)) | true | 
|  | boolean | верхняя граница включается? | upper_inc(numrange(1.1, 2.2)) | false | 
|  | boolean | нижняя граница равна бесконечности? | lower_inf('(,)'::daterange) | true | 
|  | boolean | верхняя граница равна бесконечности? | upper_inf('(,)'::daterange) | true | 
|  | anyrange | наименьший диапазон, включающий оба заданных диапазона | range_merge('[1,2)'::int4range, '[3,4)'::int4range) | [1,4) | 
Функции lower и upper возвращают NULL, если диапазон пуст или указанная граница равна бесконечности. Если же пустой диапазон передаётся функциям lower_inc, upper_inc, lower_inf и upper_inf, все они возвращают false.