6

PostgreSQL 9.4 を使用する場合:

SELECT x, lower(x), upper(x) FROM (SELECT '[1,2]'::numrange x) q;
> [1,2] | 1 | 2      -- looks OK

SELECT x, lower(x), upper(x) FROM (SELECT '[1,2]'::int4range x) q;
> [1,3) | 1 | >>3<<  -- this is unexpected

さらに確認しましょう:

SELECT x, lower(x), upper(x) FROM (SELECT '[1,3)'::numrange x) q1;
> [1,3) | 1 | 3      -- looks OK

SELECT x, lower(x), upper(x) FROM (SELECT '[1,3]'::numrange x) q1;
> [1,3] | 1 | 3      -- looks OK

pgドキュメントから:

アッパー(任意の範囲) | 範囲の要素タイプ | 範囲の上限 | upper(numrange(1.1,2.2)) | 2.2

技術的に3は整数範囲の上限ですが、すべての自然数も2以上です。関数が範囲の上限(最小上限)を返す[1,3) ∩ ℕ = {1, 2}ことを期待しています。upper

何か不足していますか?

4

2 に答える 2

2

これint4rangeは、 が離散的な範囲であるために発生します。このような範囲は、同等性をテストできるように、常に正規表現に自動的に変換されます。

SELECT '[4,8]'::int4range = '(3,9)'::int4range

組み込みの範囲型int4rangeint8range、およびdaterangeすべては、下限を含み上限を除外する正規形を使用します。つまり、[)。ただし、ユーザー定義の範囲型では、他の規則を使用できます。

于 2015-01-15T19:10:18.353 に答える
1

閉じた範囲の正規形[1,2]は、半分開いた (または半分閉じた) 範囲[1,3)です。関数 upper() は、正規形の上限を返します。

select upper(int4range(1, 2, '[]'));  -- Canonical form is '[1,3)'
--
3

その範囲には値 3 が含まれていません。

select int4range(1, 2, '[]') @> 3;
--
f

組み込みの範囲型 int4range、int8range、および daterange はすべて、下限を含み上限を除外する標準形式を使用します。あれは、 [)。ただし、ユーザー定義の範囲型では、他の規則を使用できます。

出典: PostgreSQL 離散範囲型

upper() によって返される値が包括的かどうかを知る必要がある場合は、呼び出す別の関数があります。

select upper_inc(int4range(1, 2, '[]'));
--
f
于 2015-01-15T19:37:14.473 に答える