バージョンごとのドキュメント一覧

9.20. 範囲/多重範囲関数と演算子 #

<title>Range/Multirange Functions and Operators</title>

See <xref linkend="rangetypes"/> for an overview of range types. 範囲型の概要については8.17をご覧ください。

<xref linkend="range-operators-table"/> shows the specialized operators available for range types. <xref linkend="multirange-operators-table"/> shows the specialized operators available for multirange types. In addition to those, the usual comparison operators shown in <xref linkend="functions-comparison-op-table"/> are available for range and multirange types. The comparison operators order first by the range lower bounds, and only if those are equal do they compare the upper bounds. The multirange operators compare each range until one is unequal. This does not usually result in a useful overall ordering, but the operators are provided to allow unique indexes to be constructed on ranges. 表 9.56に、範囲型専用に利用可能な演算子を示します。 表 9.57に、多重範囲(multirange)型専用に利用可能な演算子を示します。 これらに加えて表 9.1で示す通常の比較演算子が範囲型と多重範囲型で利用できます。 この比較演算子は最初に範囲の下限で順序付けし、それが等しい場合にのみ上限を比較します。 多重範囲型の演算子は各範囲を、等しくならなくなるまで比較します。 これは通常有用な全順序付けにはなりませんが、範囲に対して一意インデックスを構成することができる演算子が提供されます。

表9.56 範囲演算子

<title>Range Operators</title>

Operator 演算子

Description 説明

Example(s)

anyrange @> anyrangeboolean

Does the first range contain the second? 最初の範囲は2番目を含んでいるか?

int4range(2,4) @> int4range(2,3)t

anyrange @> anyelementboolean

Does the range contain the element? 範囲はその要素を含んでいるか?

'[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestampt

anyrange <@ anyrangeboolean

Is the first range contained by the second? 最初の範囲は2番目に含まれるか?

int4range(2,4) <@ int4range(1,7)t

anyelement <@ anyrangeboolean

Is the element contained in the range? その要素は範囲に含まれるか?

42 <@ int4range(1,7)f

anyrange && anyrangeboolean

Do the ranges overlap, that is, have any elements in common? 範囲は重なり合っているか?すなわち共通の要素があるか?

int8range(3,7) && int8range(4,12)t

anyrange << anyrangeboolean

Is the first range strictly left of the second? 最初の範囲は厳密に2番目の左か?

int8range(1,10) << int8range(100,110)t

anyrange >> anyrangeboolean

Is the first range strictly right of the second? 最初の範囲は厳密に2番目の右か?

int8range(50,60) >> int8range(20,30)t

anyrange &< anyrangeboolean

Does the first range not extend to the right of the second? 最初の範囲は2番目の右を被覆していないか?

int8range(1,20) &< int8range(18,20)t

anyrange &> anyrangeboolean

Does the first range not extend to the left of the second? 最初の範囲は2番目の左を被覆していないか?

int8range(7,20) &> int8range(5,10)t

anyrange -|- anyrangeboolean

Are the ranges adjacent? 範囲は隣接しているか?

numrange(1.1,2.2) -|- numrange(2.2,3.3)t

anyrange + anyrangeanyrange

Computes the union of the ranges. The ranges must overlap or be adjacent, so that the union is a single range (but see <function>range_merge()</function>). 範囲の和を計算します。範囲は和の結果が単一の範囲になるように、重なり合っているか、隣接していなければなりません。(ただしrange_merge()を参照してください。)

numrange(5,15) + numrange(10,20)[5,20)

anyrange * anyrangeanyrange

Computes the intersection of the ranges. 範囲の共通部分を計算します。

int8range(5,15) * int8range(10,20)[10,15)

anyrange - anyrangeanyrange

Computes the difference of the ranges. The second range must not be contained in the first in such a way that the difference would not be a single range. 範囲の差を計算します。 差が単一の範囲にならないように、2番目の範囲は最初の範囲に含まれていてはいけません。

int8range(5,15) - int8range(10,20)[5,10)


表9.57 多重範囲演算子

<title>Multirange Operators</title>

Operator 演算子

Description 説明

Example(s)

anymultirange @> anymultirangeboolean

Does the first multirange contain the second? 最初の多重範囲は2番目を含んでいるか?

'{[2,4)}'::int4multirange @> '{[2,3)}'::int4multiranget

anymultirange @> anyrangeboolean

Does the multirange contain the range? 多重範囲は範囲を含んでいるか?

'{[2,4)}'::int4multirange @> int4range(2,3)t

anymultirange @> anyelementboolean

Does the multirange contain the element? 多重範囲は要素を含んでいるか?

'{[2011-01-01,2011-03-01)}'::tsmultirange @> '2011-01-10'::timestampt

anyrange @> anymultirangeboolean

Does the range contain the multirange? 範囲は多重範囲を含んでいるか?

'[2,4)'::int4range @> '{[2,3)}'::int4multiranget

anymultirange <@ anymultirangeboolean

Is the first multirange contained by the second? 最初の多重範囲は2番目に含まれているか?

'{[2,4)}'::int4multirange <@ '{[1,7)}'::int4multiranget

anymultirange <@ anyrangeboolean

Is the multirange contained by the range? 多重範囲は範囲に含まれているか?

'{[2,4)}'::int4multirange <@ int4range(1,7)t

anyrange <@ anymultirangeboolean

Is the range contained by the multirange? 範囲は多重範囲に含まれているか?

int4range(2,4) <@ '{[1,7)}'::int4multiranget

anyelement <@ anymultirangeboolean

Is the element contained by the multirange? 要素は多重範囲に含まれているか?

4 <@ '{[1,7)}'::int4multiranget

anymultirange && anymultirangeboolean

Do the multiranges overlap, that is, have any elements in common? 多重範囲は重なっているか?すなわち、共通に持つ要素があるか?

'{[3,7)}'::int8multirange && '{[4,12)}'::int8multiranget

anymultirange && anyrangeboolean

Does the multirange overlap the range? 多重範囲は範囲と重なり合うか?

'{[3,7)}'::int8multirange && int8range(4,12)t

anyrange && anymultirangeboolean

Does the range overlap the multirange? 範囲は多重範囲と重なり合うか?

int8range(3,7) && '{[4,12)}'::int8multiranget

anymultirange << anymultirangeboolean

Is the first multirange strictly left of the second? 最初の多重範囲は厳密に2番目の左か?

'{[1,10)}'::int8multirange << '{[100,110)}'::int8multiranget

anymultirange << anyrangeboolean

Is the multirange strictly left of the range? 多重範囲は厳密に範囲の左か?

'{[1,10)}'::int8multirange << int8range(100,110)t

anyrange << anymultirangeboolean

Is the range strictly left of the multirange? 範囲は厳密に多重範囲の左か?

int8range(1,10) << '{[100,110)}'::int8multiranget

anymultirange >> anymultirangeboolean

Is the first multirange strictly right of the second? 最初の多重範囲は厳密に2番目の右か?

'{[50,60)}'::int8multirange >> '{[20,30)}'::int8multiranget

anymultirange >> anyrangeboolean

Is the multirange strictly right of the range? 多重範囲は厳密に範囲の右か?

'{[50,60)}'::int8multirange >> int8range(20,30)t

anyrange >> anymultirangeboolean

Is the range strictly right of the multirange? 範囲は厳密に多重範囲の右か?

int8range(50,60) >> '{[20,30)}'::int8multiranget

anymultirange &< anymultirangeboolean

Does the first multirange not extend to the right of the second? 最初の多重範囲は2番目の右を被覆していないか?

'{[1,20)}'::int8multirange &< '{[18,20)}'::int8multiranget

anymultirange &< anyrangeboolean

Does the multirange not extend to the right of the range? 多重範囲は範囲の右を被覆していないか?

'{[1,20)}'::int8multirange &< int8range(18,20)t

anyrange &< anymultirangeboolean

Does the range not extend to the right of the multirange? 範囲は多重範囲の右を被覆していないか?

int8range(1,20) &< '{[18,20)}'::int8multiranget

anymultirange &> anymultirangeboolean

Does the first multirange not extend to the left of the second? 最初の多重範囲は2番目の左を被覆していないか?

'{[7,20)}'::int8multirange &> '{[5,10)}'::int8multiranget

anymultirange &> anyrangeboolean

Does the multirange not extend to the left of the range? 多重範囲は範囲の左を被覆していないか?

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

anyrange &> anymultirangeboolean

Does the range not extend to the left of the multirange? 範囲は多重範囲の左を被覆していないか?

int8range(7,20) &> '{[5,10)}'::int8multiranget

anymultirange -|- anymultirangeboolean

Are the multiranges adjacent? それらの多重範囲は隣接しているか?

'{[1.1,2.2)}'::nummultirange -|- '{[2.2,3.3)}'::nummultiranget

anymultirange -|- anyrangeboolean

Is the multirange adjacent to the range? 多重範囲は範囲に連接しているか?

'{[1.1,2.2)}'::nummultirange -|- numrange(2.2,3.3)t

anyrange -|- anymultirangeboolean

Is the range adjacent to the multirange? 範囲は多重範囲に連接しているか?

numrange(1.1,2.2) -|- '{[2.2,3.3)}'::nummultiranget

anymultirange + anymultirangeanymultirange

Computes the union of the multiranges. The multiranges need not overlap or be adjacent. 多重範囲の和を計算します。 多重範囲は重なり合っている必要も、隣接している必要もありません。

'{[5,10)}'::nummultirange + '{[15,20)}'::nummultirange{[5,10), [15,20)}

anymultirange * anymultirangeanymultirange

Computes the intersection of the multiranges. 多重範囲の間の共通部分を計算します。

'{[5,15)}'::int8multirange * '{[10,20)}'::int8multirange{[10,15)}

anymultirange - anymultirangeanymultirange

Computes the difference of the multiranges. 多重範囲の間の差を計算します。

'{[5,20)}'::int8multirange - '{[10,15)}'::int8multirange{[5,10), [15,20)}


The left-of/right-of/adjacent operators always return false when an empty range or multirange is involved; that is, an empty range is not considered to be either before or after any other range. 空の範囲あるいは多重範囲が含まれる場合、「左」「右」「隣接」演算子は常に偽を返します。つまり、空の範囲は他の範囲の前でも後ろでもないと見なされます。

Elsewhere empty ranges and multiranges are treated as the additive identity: anything unioned with an empty value is itself. Anything minus an empty value is itself. An empty multirange has exactly the same points as an empty range. Every range contains the empty range. Every multirange contains as many empty ranges as you like. 他の場所では、空の範囲と多重範囲は加法単位元として扱われます。 空の値との和は自分自身です。 空の値を引いたものは自分自身です。 空の多重範囲は空の範囲と正確に同じ特徴を持ちます。 すべての範囲は空の範囲を含みます。 すべての多重範囲はいくらでも空の範囲を含むことができます。

The range union and difference operators will fail if the resulting range would need to contain two disjoint sub-ranges, as such a range cannot be represented. There are separate operators for union and difference that take multirange parameters and return a multirange, and they do not fail even if their arguments are disjoint. So if you need a union or difference operation for ranges that may be disjoint, you can avoid errors by first casting your ranges to multiranges. 範囲の和と差演算子は、結果の範囲に2つの隣接しない副範囲が含まれる場合には失敗します。 そのような範囲は表現できないからです。 多重範囲引数を取り、多重範囲を返す別の和と差の演算子があり、引数が隣接していなくても失敗しません。 隣接しないかもしれない範囲の和あるいは差の演算が必要なら、まず範囲を多重範囲にキャストすることによってエラーを避けることができます。

<xref linkend="range-functions-table"/> shows the functions available for use with range types. <xref linkend="multirange-functions-table"/> shows the functions available for use with multirange types. 表 9.58に範囲型で利用可能な関数を示します。 表 9.59に多重範囲型で利用可能な関数を示します。

表9.58 範囲関数

<title>Range Functions</title>

Function 関数

Description 説明

Example(s)

lower ( anyrange ) → anyelement

Extracts the lower bound of the range (<literal>NULL</literal> if the range is empty or has no lower bound). 範囲の下限を取り出します。(範囲が空か下限がない場合NULLとなります。)

lower(numrange(1.1,2.2))1.1

upper ( anyrange ) → anyelement

Extracts the upper bound of the range (<literal>NULL</literal> if the range is empty or has no upper bound). 範囲の上限を取り出します。(範囲が空か上限がない場合はNULLとなります。)

upper(numrange(1.1,2.2))2.2

isempty ( anyrange ) → boolean

Is the range empty? 範囲は空か?

isempty(numrange(1.1,2.2))f

lower_inc ( anyrange ) → boolean

Is the range's lower bound inclusive? 範囲の下限は境界を含むか?

lower_inc(numrange(1.1,2.2))t

upper_inc ( anyrange ) → boolean

Is the range's upper bound inclusive? 範囲の上限は境界を含むか?

upper_inc(numrange(1.1,2.2))f

lower_inf ( anyrange ) → boolean

Does the range have no lower bound? (A lower bound of <literal>-Infinity</literal> returns false.) 範囲に下限があるか? (-Infinityの下限は偽を返します。)

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

upper_inf ( anyrange ) → boolean

Does the range have no upper bound? (An upper bound of <literal>Infinity</literal> returns false.) 範囲に上限はあるか? (Infinityの上限は偽を返します。)

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

range_merge ( anyrange, anyrange ) → anyrange

Computes the smallest range that includes both of the given ranges. 与えられた両方の範囲を含む最小の範囲を計算します。

range_merge('[1,2)'::int4range, '[3,4)'::int4range)[1,4)


表9.59 多重範囲関数

<title>Multirange Functions</title>

Function 関数

Description 説明

Example(s)

lower ( anymultirange ) → anyelement

Extracts the lower bound of the multirange (<literal>NULL</literal> if the multirange is empty has no lower bound). 多重範囲の下限を取り出します。(多重範囲が空か下限がない場合はNULLとなります。)

lower('{[1.1,2.2)}'::nummultirange)1.1

upper ( anymultirange ) → anyelement

Extracts the upper bound of the multirange (<literal>NULL</literal> if the multirange is empty or has no upper bound). 多重範囲の上限を取り出します。(多重範囲が空か上限がない場合はNULLとなります。)

upper('{[1.1,2.2)}'::nummultirange)2.2

isempty ( anymultirange ) → boolean

Is the multirange empty? 多重範囲は空か?

isempty('{[1.1,2.2)}'::nummultirange)f

lower_inc ( anymultirange ) → boolean

Is the multirange's lower bound inclusive? 多重範囲の下限は境界を含むか?

lower_inc('{[1.1,2.2)}'::nummultirange)t

upper_inc ( anymultirange ) → boolean

Is the multirange's upper bound inclusive? 多重範囲の上限は境界を含むか?

upper_inc('{[1.1,2.2)}'::nummultirange)f

lower_inf ( anymultirange ) → boolean

Does the multirange have no lower bound? (A lower bound of <literal>-Infinity</literal> returns false.) 多重範囲は下限があるか? (-Infinityの下限は偽を返します。)

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

upper_inf ( anymultirange ) → boolean

Does the multirange have no upper bound? (An upper bound of <literal>Infinity</literal> returns false.) 多重範囲は上限があるか? (Infinityの上限は偽を返します。)

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

range_merge ( anymultirange ) → anyrange

Computes the smallest range that includes the entire multirange. 与えられた多重範囲全体を含む最小の範囲を計算します。

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

multirange ( anyrange ) → anymultirange

Returns a multirange containing just the given range. ちょうど与えられた範囲を含む多重範囲を返す。

multirange('[1,2)'::int4range){[1,2)}

unnest ( anymultirange ) → setof anyrange

Expands a multirange into a set of ranges in ascending order. 複数範囲を昇順の集合に展開します。

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

 [1,2)
 [3,4)


The <function>lower_inc</function>, <function>upper_inc</function>, <function>lower_inf</function>, and <function>upper_inf</function> functions all return false for an empty range or multirange. lower_incupper_inclower_infupper_infはすべて空の多重範囲に対して偽を返します。