Диапазонные/мультидиапазонные функции и операторы
Описание диапазонных типов данных см. в разделе Диапазонные типы.
В Таблице 53 приведены специальные операторы, имеющиеся для диапазонных типов. В Таблице 54 приведены специальные операторы, имеющиеся для мультидиапазонных типов. Помимо них для диапазонных и мультидиапазонных типов имеются обычные операторы сравнения, перечисленные в таблице Операторы сравнения. Операторы сравнения сначала сравнивают нижние границы диапазонов, и только если они равны, сравнивают верхние границы. Мультидиапазонные операторы сравнивают каждый диапазон, пока не найдут неравный. Такие операции обычно не приводят к полезному в целом упорядочиванию, но зато позволяют строить по диапазонам уникальные индексы.
Таблица 53. Диапазонные операторы
Оператор |
||
---|---|---|
Описание Пример(ы) |
||
anyrange @> anyrange → boolean |
||
Первый диапазон содержит второй?
|
||
anyrange @> anyelement → boolean |
||
Диапазон содержит этот элемент?
|
||
anyrange <@ anyrange → boolean |
||
Первый диапазон содержится во втором?
|
||
anyelement <@ anyrange → boolean |
||
Элемент содержится в этом диапазоне?
|
||
anyrange && anyrange → boolean |
||
Диапазоны пересекаются, то есть имеют какие-либо общие элементы?
|
||
anyrange << anyrange → boolean |
||
Первый диапазон находится строго слева от второго?
|
||
anyrange >> anyrange → boolean |
||
Первый диапазон находится строго справа от второго?
|
||
anyrange &< anyrange → boolean |
||
Первый диапазон не простирается правее второго?
|
||
anyrange &> anyrange → boolean |
||
Первый диапазон не простирается левее второго?
|
||
anyrange -|- anyrange → boolean |
||
Диапазоны граничат друг с другом?
|
||
anyrange + anyrange → anyrange |
||
Вычисляет объединение диапазонов. Диапазоны должны пересекаться или граничить друг с другом, чтобы их объединение было одним диапазоном (но см. range_merge()).
|
||
anyrange * anyrange → anyrange |
||
Вычисляет пересечение диапазонов.
|
||
anyrange - anyrange → anyrange |
||
Вычисляет разность диапазонов. Второй диапазон не должен содержаться в первом таким образом, чтобы разностью был не один диапазон.
|
Таблица 54. Мультидиапазонные операторы
Оператор |
||
---|---|---|
Описание Пример(ы) |
||
anymultirange @> anymultirange → boolean |
||
Первый мультидиапазон содержит второй?
|
||
anymultirange @> anyrange → boolean |
||
Мультидиапазон содержит этот диапазон?
|
||
anymultirange @> anyelement → boolean |
||
Мультидиапазон содержит этот элемент?
|
||
anyrange @> anymultirange → boolean |
||
Диапазон содержит этот мультидиапазон?
|
||
anymultirange <@ anymultirange → boolean |
||
Первый мультидиапазон содержится во втором?
|
||
anymultirange <@ anyrange → boolean |
||
Мультидиапазон содержится в этом диапазоне?
|
||
anyrange <@ anymultirange → boolean |
||
Диапазон содержится в этом мультидиапазоне?
|
||
anyelement <@ anymultirange → boolean |
||
Элемент содержится в этом мультидиапазоне?
|
||
anymultirange && anymultirange → boolean |
||
Мультидиапазоны пересекаются, то есть имеют какие-либо общие элементы?
|
||
anymultirange && anyrange → boolean |
||
Мультидиапазон пересекает этот диапазон?
|
||
anyrange && anymultirange → boolean |
||
Диапазон пересекает этот мультидиапазон?
|
||
anymultirange << anymultirange → boolean |
||
Первый мультидиапазон находится строго слева от второго?
|
||
anymultirange << anyrange → boolean |
||
Мультидиапазон находится строго слева от этого диапазона?
|
||
anyrange << anymultirange → boolean |
||
Диапазон находится строго слева от этого мультидиапазона?
|
||
anymultirange >> anymultirange → boolean |
||
Первый мультидиапазон находится строго справа от второго?
|
||
anymultirange >> anyrange → boolean |
||
Мультидиапазон находится строго справа от этого диапазона?
|
||
anyrange >> anymultirange → boolean |
||
Диапазон находится строго справа от этого мультидиапазона?
|
||
anymultirange &< anymultirange → boolean |
||
Первый мультидиапазон не простирается правее второго?
|
||
anymultirange &< anyrange → boolean |
||
Мультидиапазон не простирается правее этого диапазона?
|
||
anyrange &< anymultirange → boolean |
||
Диапазон не простирается правее этого мультидиапазона?
|
||
anymultirange &> anymultirange → boolean |
||
Первый мультидиапазон не простирается левее второго?
|
||
anymultirange &> anyrange → boolean |
||
Мультидиапазон не простирается левее этого диапазона?
|
||
anyrange &> anymultirange → boolean |
||
Диапазон не простирается левее этого мультидиапазона?
|
||
anymultirange -|- anymultirange → boolean |
||
Мультидиапазоны граничат друг с другом?
|
||
anymultirange -|- anyrange → boolean |
||
Мультидиапазон граничит с этим диапазоном?
|
||
anyrange -|- anymultirange → boolean |
||
Диапазон граничит с этим мультидиапазоном?
|
||
anymultirange + anymultirange → anymultirange |
||
Вычисляет объединение мультидиапазонов. Мультидиапазонам необязательно пересекаться или граничить друг с другом.
|
||
anymultirange * anymultirange → anymultirange |
||
Вычисляет пересечение мультидиапазонов.
|
||
anymultirange - anymultirange → anymultirange |
||
Вычисляет разность мультидиапазонов.
|
Операторы слева/справа/граничит всегда возвращают false, когда один из диапазонов или мультидиапазонов пуст; то есть считается, что пустой диапазон находится не перед и не после какого-либо другого диапазона.
В остальных случаях пустые диапазоны и мультидиапазоны воспринимаются как нулевой элемент: все, что объединяется с пустым значением, остается неизменным. Все, из чего вычитается пустое значение, остается неизменным. Пустой мультидиапазон имеет точно такие же особенности, что и пустой диапазон. Каждый диапазон содержит пустой диапазон. Каждый мультидиапазон содержит сколько угодно пустых диапазонов.
Операторы объединения и разности выдадут ошибку, если результирующему диапазону нужно содержать два непересекающихся поддиапазона, поскольку у таких диапазонов не может быть представления. Существуют отдельные операторы для объединения и разности, которые принимают мультидиапазонные параметры и возвращают мультидиапазон, и они не выдают ошибку, даже если их аргументы не пересекаются. Поэтому если вам требуется объединение или разность диапазонов, которые могут быть непересекающимися, ошибки можно избежать, если сначала привести диапазоны к мультидиапазонам.
В Таблице 55 приведены имеющиеся функции для диапазонных типов. В Таблице 56 приведены функции для мультидиапазонных типов.
Таблица 55. Диапазонные функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
lower ( anyrange ) → anyelement |
||
Извлекает нижнюю границу диапазона (NULL, если диапазон пуст или его нижняя граница бесконечна).
|
||
upper ( anyrange ) → anyelement |
||
Извлекает верхнюю границу диапазона (NULL, если диапазон пуст или его верхняя граница бесконечна).
|
||
isempty ( anyrange ) → boolean |
||
Диапазон пустой?
|
||
lower_inc ( anyrange ) → boolean |
||
Нижняя граница диапазона включена в него?
|
||
upper_inc ( anyrange ) → boolean |
||
Верхняя граница диапазона включена в него?
|
||
lower_inf ( anyrange ) → boolean |
||
Нижняя граница диапазона бесконечна?
|
||
upper_inf ( anyrange ) → boolean |
||
Верхняя граница диапазона бесконечна?
|
||
range_merge ( anyrange, anyrange ) → anyrange |
||
Вычисляет наименьший диапазон, включающий оба заданных диапазона.
|
Таблица 56. Мультидиапазонные функции
Функция |
||
---|---|---|
Описание Пример(ы) |
||
lower ( anymultirange ) → anyelement |
||
Извлекает нижнюю границу мультидиапазона (NULL, если мультидиапазон пуст или его нижняя граница бесконечна).
|
||
upper ( anymultirange ) → anyelement |
||
Извлекает верхнюю границу мультидиапазона (NULL, если мультидиапазон пуст или его верхняя граница бесконечна).
|
||
isempty ( anymultirange ) → boolean |
||
Мультидиапазон пустой?
|
||
lower_inc ( anymultirange ) → boolean |
||
Нижняя граница мультидиапазона включена в него?
|
||
upper_inc ( anymultirange ) → boolean |
||
Верхняя граница мультидиапазона включена в него?
|
||
lower_inf ( anymultirange ) → boolean |
||
Нижняя граница мультидиапазона бесконечна?
|
||
upper_inf ( anymultirange ) → boolean |
||
Верхняя граница мультидиапазона бесконечна?
|
||
range_merge ( anymultirange ) → anyrange |
||
Вычисляет наименьший диапазон, включающий весь заданный мультидиапазон.
|
||
multirange ( anyrange ) → anymultirange |
||
Возвращает мультидиапазон, содержащий только заданный диапазон.
|
||
unnest ( anymultirange ) → setof anyrange |
||
Разворачивает мультидиапазон в набор диапазонов. Диапазоны прочитываются в порядке хранения (по возрастанию)
|
Функции lower_inc, upper_inc, lower_inf и upper_inf возвращают false, если диапазон или мультидиапазон пуст.