9.20. Функции и операторы диапазонов/мультидиапазонов#

9.20. Функции и операторы диапазонов/мультидиапазонов

9.20. Функции и операторы диапазонов/мультидиапазонов

См. Раздел 8.17 для обзора типов диапазонов.

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

Таблица 9.54. Операторы диапазона

Оператор

Описание

Пример(ы)

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)


Таблица 9.55. Операторы множественного диапазона

Оператор

Описание

Пример(ы)

anymultirange @> anymultirangeboolean

Содержит ли первый мультидиапазон второй?

'{[2,4)}'::int4multirange @> '{[2,3)}'::int4multiranget

anymultirange @> anyrangeboolean

Содержит ли мультидиапазон диапазон?

'{[2,4)}'::int4multirange @> int4range(2,3)t

anymultirange @> anyelementboolean

Содержит ли мультидиапазон элемент?

'{[2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestampt

anyrange @> anymultirangeboolean

Содержит ли диапазон мультидиапазон?

'[2,4)'::int4range @> '{[2,3)}'::int4multiranget

anymultirange <@ anymultirangeboolean

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

'{[2,4)}'::int4multirange <@ '{[1,7)}'::int4multiranget

anymultirange <@ anyrangeboolean

Содержится ли мультидиапазон в диапазоне?

'{[2,4)}'::int4multirange <@ int4range(1,7)t

anyrange <@ anymultirangeboolean

Содержится ли диапазон в мультидиапазоне?

int4range(2,4) <@ '{[1,7)}'::int4multiranget

anyelement <@ anymultirangeboolean

Содержится ли элемент в мультидиапазоне?

4 <@ '{[1,7)}'::int4multiranget

anymultirange && anymultirangeboolean

Перекрываются ли мультидиапазоны, то есть, имеют ли они какие-либо общие элементы?

'{[3,7)}'::int8multirange && '{[4,12)}'::int8multiranget

anymultirange && anyrangeboolean

Перекрывает ли мультидиапазон диапазон?

'{[3,7)}'::int8multirange && int8range(4,12)t

anyrange && anymultirangeboolean

Перекрывается ли диапазон с мультидиапазоном?

int8range(3,7) && '{[4,12)}'::int8multiranget

anymultirange << anymultirangeboolean

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

'{[1,10)}'::int8multirange << '{[100,110)}'::int8multiranget

anymultirange << anyrangeboolean

Является ли мультидиапазон строго левее диапазона?

'{[1,10)}'::int8multirange << int8range(100,110)t

anyrange << anymultirangeboolean

Является ли диапазон строго слева от мультидиапазона?

int8range(1,10) << '{[100,110)}'::int8multiranget

anymultirange >> anymultirangeboolean

Является ли первый мультидиапазон строго правее второго?

'{[50,60)}'::int8multirange >> '{[20,30)}'::int8multiranget

anymultirange >> anyrangeboolean

Является ли мультидиапазон строго правее диапазона?

'{[50,60)}'::int8multirange >> int8range(20,30)t

anyrange >> anymultirangeboolean

Является ли диапазон строго правее мультидиапазона?

int8range(50,60) >> '{[20,30)}'::int8multiranget

anymultirange &< anymultirangeboolean

Не простирается ли первый мультидиапазон за пределы второго вправо?

'{[1,20)}'::int8multirange &< '{[18,20)}'::int8multiranget

anymultirange &< anyrangeboolean

Не распространяется ли мультидиапазон вправо от диапазона?

'{[1,20)}'::int8multirange &< int8range(18,20)t

anyrange &< anymultirangeboolean

Не распространяется ли диапазон вправо от мультидиапазона?

int8range(1,20) &< '{[18,20)}'::int8multiranget

anymultirange &> anymultirangeboolean

Не распространяется ли первый мультидиапазон влево от второго?

'{[7,20)}'::int8multirange &> '{[5,10)}'::int8multiranget

anymultirange &> anyrangeboolean

Не распространяется ли мультидиапазон влево от диапазона?

'{[7,20)}'::int8multirange &> int8range(5,10)t

anyrange &> anymultirangeboolean

Расширяется ли диапазон влево от мультидиапазона?

int8range(7,20) &> '{[5,10)}'::int8multiranget

anymultirange -|- anymultirangeboolean

Являются ли мультидиапазоны смежными?

'{[1.1,2.2)}'::nummultirange -|- '{[2.2,3.3)}'::nummultiranget

anymultirange -|- anyrangeboolean

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

'{[1.1,2.2)}'::nummultirange -|- numrange(2.2,3.3)t

anyrange -|- anymultirangeboolean

Является ли диапазон смежным с мультидиапазоном?

numrange(1.1,2.2) -|- '{[2.2,3.3)}'::nummultiranget

anymultirange + anymultirangeanymultirange

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

'{[5,10)}'::nummultirange + '{[15,20)}'::nummultirange{[5,10), [15,20)}

anymultirange * anymultirangeanymultirange

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

'{[5,15)}'::int8multirange * '{[10,20)}'::int8multirange{[10,15)}

anymultirange - anymultirangeanymultirange

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

'{[5,20)}'::int8multirange - '{[10,15)}'::int8multirange{[5,10), [15,20)}


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

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

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

Таблица 9.56 показывает функции, доступные для использования с типами диапазонов. Таблица 9.57 показывает функции, доступные для использования с типами мультидиапазонов.

Таблица 9.56. Функции диапазона

Функция

Описание

Пример(ы)

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)


Таблица 9.57. Функции множественного диапазона

Функция

Описание

Пример(ы)

lower ( anymultirange ) → anyelement

Извлекает нижнюю границу мультидиапазона (NULL, если мультидиапазон пуст или нижняя граница является бесконечной).

lower('{[1.1,2.2)}'::nummultirange)1.1

upper ( anymultirange ) → anyelement

Извлекает верхнюю границу мультидиапазона (NULL, если мультидиапазон пуст или верхняя граница бесконечна).

upper('{[1.1,2.2)}'::nummultirange)2.2

isempty ( anymultirange ) → boolean

Пуст ли мультидиапазон?

isempty('{[1.1,2.2)}'::nummultirange)f

lower_inc ( anymultirange ) → boolean

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

lower_inc('{[1.1,2.2)}'::nummultirange)t

upper_inc ( anymultirange ) → boolean

Инклюзивна ли верхняя граница мультидиапазона?

upper_inc('{[1.1,2.2)}'::nummultirange)f

lower_inf ( anymultirange ) → boolean

Является ли нижняя граница мультидиапазона бесконечной?

lower_inf('{(,)}'::datemultirange)t

upper_inf ( anymultirange ) → boolean

Является ли верхняя граница мультидиапазона бесконечной?

upper_inf('{(,)}'::datemultirange)t

range_merge ( anymultirange ) → anyrange

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

range_merge('{[1,2), [3,4)}'::int4multirange)[1,4)

multirange ( anyrange ) → anymultirange

Возвращает мультидиапазон, содержащий только указанный диапазон.

multirange('[1,2)'::int4range){[1,2)}

unnest ( anymultirange ) → setof anyrange

Расширяет мультидиапазон в набор диапазонов. Диапазоны считываются в порядке хранения (возрастающем).

unnest('{[1,2), [3,4)}'::int4multirange)

 [1,2)
 [3,4)


Функции lower_inc, upper_inc, lower_inf и upper_inf возвращают false для пустого диапазона или множественного диапазона.