私の知る限り、 CASE WHEN... を使用することが境界を取得する最良の方法です。すべてのネイティブ範囲型の範囲境界を返すいくつかの単純なユーザー定義関数を次に示します。
警告:これらの関数は驚くべき方法で動作します。
組み込みの範囲型int4range、int8range、および daterangeはすべて、下限を含み上限を除外する標準形式を使用します。あれは、 [)。
と
ここでは '(]' が指定されていますが、int8range は離散範囲型であるため、表示される値は標準的な形式に変換されます. . .
(強調追加)
PostgreSQL は、1 から 10 までの閉じた範囲を 1 から 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;