Насколько я знаю, использование CASE WHEN ... - лучший способ получить оценки. Вот несколько простых пользовательских функций, которые возвращают границы диапазона для всех собственных типов диапазонов.
Предупреждение: Эти функции ведут себя удивительными способами, поскольку типы диапазонов ведут себя в sometimes surprising ways.
Встроенный типов диапазона int4range, int8range и DateRange все используют каноническую форму, которая включает в себя нижнюю границу и не включает верхнюю границу ; то есть, [).
И
Хотя '(]' указано здесь, на дисплее значение будет преобразуется в канонической форме, поскольку int8range представляет собой тип дискретный диапазон...
(выделено мной)
PostgreSQL позволяет канонизировать замкнутый диапазон от 1 до 10 в полуоткрытом диапазоне от 1 до 10 до 11.
select int4range('[1,10]');
[1,11)
Он делает то же самое для диапазонов, которые наполовину открыты слева.
select int4range('(1,10]');
[2,11)
range_bounds() возвращает оценки для результата, а не для ввода.
select range_bounds(int4range('(1,10]'));
[)
Функции
create or replace function range_bounds(in range int4range)
returns char(2) as
$$
select case when lower_inc(range) then '[' else '(' end ||
case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;
create or replace function range_bounds(in range int8range)
returns char(2) as
$$
select case when lower_inc(range) then '[' else '(' end ||
case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;
create or replace function range_bounds(in range numrange)
returns char(2) as
$$
select case when lower_inc(range) then '[' else '(' end ||
case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;
create or replace function range_bounds(in range tsrange)
returns char(2) as
$$
select case when lower_inc(range) then '[' else '(' end ||
case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;
create or replace function range_bounds(in range tstzrange)
returns char(2) as
$$
select case when lower_inc(range) then '[' else '(' end ||
case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;
create or replace function range_bounds(in range daterange)
returns char(2) as
$$
select case when lower_inc(range) then '[' else '(' end ||
case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;