Диапазонные/мультидиапазонные функции и операторы

Обзор диапазонных типов данных см. в разделе Диапазонные типы.



Операторы

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


Диапазонные операторы

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

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

3 || ARRAY[4,5,6] → {3,4,5,6}

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) → &lbrack;5,20)

anyrange * anyrange → anyrange

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

int8range(5,15) * int8range(10,20) → &lbrack;10,15)

anyrange - anyrange → anyrange

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

int8range(5,15) - int8range(10,20) → &lbrack;5,10)

Мультидиапазонные операторы

anymultirange @> anymultirange → boolean

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

'{&lbrack;2,4)}'::int4multirange @> '{&lbrack;2,3)}'::int4multirange → t

anymultirange @> anyrange → boolean

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

'{&lbrack;2,4)}'::int4multirange @> int4range(2,3) → t

anymultirange @> anyelement → boolean

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

'{&lbrack;2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestamp → t

anyrange @> anymultirange → boolean

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

'&lbrack;2,4)'::int4range @> '{&lbrack;2,3)}'::int4multirange → t

anymultirange <@ anymultirange → boolean

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

'{&lbrack;2,4)}'::int4multirange <@ '{&lbrack;1,7)}'::int4multirange → t

anymultirange <@ anyrange → boolean

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

'{&lbrack;2,4)}'::int4multirange <@ int4range(1,7) → t

anyrange <@ anymultirange → boolean

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

int4range(2,4) <@ '{&lbrack;1,7)}'::int4multirange → t

anyelement <@ anymultirange → boolean

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

42 <@ '{&lbrack;1,7)}'::int4multirange → t

anymultirange && anymultirange → boolean

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

'{&lbrack;3,7)}'::int8multirange && '{&lbrack;4,12)}'::int8multirange → t

anymultirange && anyrange → boolean

Мультидиапазон пересекается с этим диапазоном?

'{&lbrack;3,7)}'::int8multirange && int8range(4,12) → t

anyrange && anymultirange → boolean

Диапазон пересекается с этим мультидиапазоном?

int8range(3,7) && '{&lbrack;4,12)}'::int8multirange → t

anymultirange << anymultirange → boolean

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

'{&lbrack;1,10)}'::int8multirange << '{&lbrack;100,110)}'::int8multirange → t

anymultirange << anyrange → boolean

Мультидиапазон находится строго слева от этого диапазона?

'{&lbrack;1,10)}'::int8multirange << int8range(100,110) → t

anyrange << anymultirange → boolean

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

int8range(1,10) << '{&lbrack;100,110)}'::int8multirange → t

anymultirange >> anymultirange → boolean

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

'{&lbrack;50,60)}'::int8multirange >> '{&lbrack;20,30)}'::int8multirange → t

anymultirange >> anyrange → boolean

Мультидиапазон находится строго справа от этого диапазона?

'{&lbrack;50,60)}'::int8multirange >> int8range(20,30) → t

anyrange >> anymultirange → boolean

Диапазон находится строго справа от этого мультидиапазона?

int8range(50,60) >> '{&lbrack;20,30)}'::int8multirange → t

anymultirange &< anymultirange → boolean

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

'{&lbrack;1,20)}'::int8multirange &< '{&lbrack;18,20)}'::int8multirange → t

anymultirange &< anyrange → boolean

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

'{&lbrack;1,20)}'::int8multirange &< int8range(18,20) → t

anyrange &< anymultirange → boolean

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

int8range(1,20) &< '{&lbrack;18,20)}'::int8multirange → t

anymultirange &> anymultirange → boolean

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

'{&lbrack;7,20)}'::int8multirange &> '{&lbrack;5,10)}'::int8multirange → t

anymultirange &> anyrange → boolean

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

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

anyrange &> anymultirange → boolean

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

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

anymultirange -|- anymultirange → boolean

Мультидиапазоны граничат друг с другом?

'{&lbrack;1.1,2.2)}'::nummultirange -|- '{&lbrack;2.2,3.3)}'::nummultirange → t

anymultirange -|- anyrange → boolean

Мультидиапазон граничит с этим диапазоном?

'{&lbrack;1.1,2.2)}'::nummultirange -|- numrange(2.2,3.3) → t

anyrange -|- anymultirange → boolean

Диапазон граничит с этим мультидиапазоном?

numrange(1.1,2.2) -|- '{&lbrack;2.2,3.3)}'::nummultirange → t

anymultirange + anymultirange → anymultirange

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

'{&lbrack;5,10)}'::nummultirange + '{&lbrack;15,20)}'::nummultirange → {&lbrack;5,10), &lbrack;15,20)}

anymultirange * anymultirange → anymultirange

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

'{&lbrack;5,15)}'::int8multirange * '{&lbrack;10,20)}'::int8multirange → {&lbrack;10,15)}

anymultirange - anymultirange → anymultirange

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

'{&lbrack;5,20)}'::int8multirange - '{&lbrack;10,15)}'::int8multirange → {&lbrack;5,10), &lbrack;15,20)}

Примечания

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

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

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



Функции

В подразделе Диапазонные функции приведены имеющиеся функции для диапазонных типов. В подразделе Мультидиапазонные функции приведены имеющиеся функции для мультидиапазонных типов.


Диапазонные функции

lower

lower ( anyrange ) → anyelement

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

lower(numrange(1.1,2.2)) → 1.1

upper

upper ( anyrange ) → anyelement

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

upper(numrange(1.1,2.2)) → 2.2

isempty

isempty ( anyrange ) → boolean

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

isempty(numrange(1.1,2.2)) → f

lower_inc

lower_inc ( anyrange ) → boolean

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

lower_inc(numrange(1.1,2.2)) → t

upper_inc

upper_inc ( anyrange ) → boolean

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

upper_inc(numrange(1.1,2.2)) → f

lower_inf

lower_inf ( anyrange ) → boolean

Диапазон не имеет нижней границы? (При нижней границе -Infinity возвращает false.)

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

upper_inf

upper_inf ( anyrange ) → boolean

Диапазон не имеет верхней границы? (При верхней границе Infinity возвращает false.)

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

range_merge

range_merge ( anyrange, anyrange ) → anyrange

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

range_merge('&lbrack;1,2)'::int4range, '&lbrack;3,4)'::int4range) → &lbrack;1,4)

Мультидиапазонные функции

lower

lower ( anymultirange ) → anyelement

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

lower('{&lbrack;1.1,2.2)}'::nummultirange) → 1.1

upper

upper ( anymultirange ) → anyelement

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

upper('{&lbrack;1.1,2.2)}'::nummultirange) → 2.2

isempty

isempty ( anymultirange ) → boolean

Мультидиапазон пустой?

isempty('{&lbrack;1.1,2.2)}'::nummultirange) → f

lower_inc

lower_inc ( anymultirange ) → boolean

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

lower_inc('{&lbrack;1.1,2.2)}'::nummultirange) → t

upper_inc

upper_inc ( anymultirange ) → boolean

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

upper_inc('{&lbrack;1.1,2.2)}'::nummultirange) → f

lower_inf

lower_inf ( anymultirange ) → boolean

Мультидиапазон не имеет нижней границы? (При нижней границе -Infinity возвращает false.)

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

upper_inf

upper_inf ( anymultirange ) → boolean

Мультидиапазон не имеет верхней границы? (При верхней границе Infinity возвращает false.)

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

range_merge

range_merge ( anymultirange ) → anyrange

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

range_merge('{&lbrack;1,2), &lbrack;3,4)}'::int4multirange) → &lbrack;1,4)

multirange

multirange ( anyrange ) → anymultirange

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

multirange('&lbrack;1,2)'::int4range) → {&lbrack;1,2)}

unnest

unnest ( anymultirange ) → setof anyrange

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

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

    [1,2)
    [3,4)

Примечание

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