他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

範囲型の概要については8.17をご覧ください。

表 9.55に、範囲型専用に利用可能な演算子を示します。 表 9.56に、多重範囲(multirange)型専用に利用可能な演算子を示します。 これらに加えて表 9.1で示す通常の比較演算子が範囲型と多重範囲型で利用できます。 この比較演算子は最初に範囲の下限で順序付けし、それが等しい場合にのみ上限を比較します。 多重範囲型の演算子は各範囲を、等しくならなくなるまで比較します。 これは通常有用な全順序付けにはなりませんが、範囲に対して一意インデックスを構成することができる演算子が提供されます。

表9.55 範囲演算子

演算子

説明

anyrange @> anyrangeboolean

最初の範囲は2番目を含んでいるか?

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

anyrange @> anyelementboolean

範囲はその要素を含んでいるか?

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

anyrange <@ anyrangeboolean

最初の範囲は2番目に含まれるか?

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

anyelement <@ anyrangeboolean

その要素は範囲に含まれるか?

42 <@ int4range(1,7)f

anyrange && anyrangeboolean

範囲は重なり合っているか?すなわち共通の要素があるか?

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

anyrange << anyrangeboolean

最初の範囲は厳密に2番目の左か?

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

anyrange >> anyrangeboolean

最初の範囲は厳密に2番目の右か?

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

anyrange &< anyrangeboolean

最初の範囲は2番目の右を被覆していないか?

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

anyrange &> anyrangeboolean

最初の範囲は2番目の左を被覆していないか?

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

anyrange -|- anyrangeboolean

範囲は隣接しているか?

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

anyrange + anyrangeanyrange

範囲の和を計算します。範囲は和の結果が単一の範囲になるように、重なり合っているか、隣接していなければなりません。(ただしrange_merge()を参照してください。)

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

anyrange * anyrangeanyrange

範囲の共通部分を計算します。

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

anyrange - anyrangeanyrange

範囲の差を計算します。 差が単一の範囲にならないように、2番目の範囲は最初の範囲に含まれていてはいけません。

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


表9.56 多重範囲演算子

演算子

説明

anymultirange @> anymultirangeboolean

最初の多重範囲は2番目を含んでいるか?

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

anymultirange @> anyrangeboolean

多重範囲は範囲を含んでいるか?

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

anymultirange @> anyelementboolean

多重範囲は要素を含んでいるか?

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

anyrange @> anymultirangeboolean

範囲は多重範囲を含んでいるか?

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

anymultirange <@ anymultirangeboolean

最初の多重範囲は2番目に含まれているか?

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

anymultirange <@ anyrangeboolean

多重範囲は範囲に含まれているか?

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

anyrange <@ anymultirangeboolean

範囲は多重範囲に含まれているか?

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

anyelement <@ anymultirangeboolean

要素は多重範囲に含まれているか?

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

anymultirange && anymultirangeboolean

多重範囲は重なっているか?すなわち、共通に持つ要素があるか?

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

anymultirange && anyrangeboolean

多重範囲は範囲と重なり合うか?

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

anyrange && anymultirangeboolean

範囲は多重範囲と重なり合うか?

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

anymultirange << anymultirangeboolean

最初の多重範囲は厳密に2番目の左か?

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

anymultirange << anyrangeboolean

多重範囲は厳密に範囲の左か?

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

anyrange << anymultirangeboolean

範囲は厳密に多重範囲の左か?

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

anymultirange >> anymultirangeboolean

最初の多重範囲は厳密に2番目の右か?

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

anymultirange >> anyrangeboolean

多重範囲は厳密に範囲の右か?

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

anyrange >> anymultirangeboolean

範囲は厳密に多重範囲の右か?

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

anymultirange &< anymultirangeboolean

最初の多重範囲は2番目の右を被覆していないか?

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

anymultirange &< anyrangeboolean

多重範囲は範囲の右を被覆していないか?

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

anyrange &< anymultirangeboolean

範囲は多重範囲の右を被覆していないか?

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

anymultirange &> anymultirangeboolean

最初の多重範囲は2番目の左を被覆していないか?

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

anymultirange &> anyrangeboolean

多重範囲は範囲の左を被覆していないか?

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

anyrange &> anymultirangeboolean

範囲は多重範囲の左を被覆していないか?

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

anymultirange -|- anymultirangeboolean

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

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

anymultirange -|- anyrangeboolean

多重範囲は範囲に連接しているか?

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

anyrange -|- anymultirangeboolean

範囲は多重範囲に連接しているか?

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

anymultirange + anymultirangeanymultirange

多重範囲の和を計算します。 多重範囲は重なり合っている必要も、隣接している必要もありません。

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

anymultirange * anymultirangeanymultirange

多重範囲の間の共通部分を計算します。

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

anymultirange - anymultirangeanymultirange

多重範囲の間の差を計算します。

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


空の範囲あるいは多重範囲が含まれる場合、「左」「右」「隣接」演算子は常に偽を返します。つまり、空の範囲は他の範囲の前でも後ろでもないと見なされます。

他の場所では、空の範囲と多重範囲は加法単位元として扱われます。 空の値との和は自分自身です。 空の値を引いたものは自分自身です。 空の多重範囲は空の範囲と正確に同じ特徴を持ちます。 すべての範囲は空の範囲を含みます。 すべての多重範囲はいくらでも空の範囲を含むことができます。

範囲の和と差演算子は、結果の範囲に2つの隣接しない副範囲が含まれる場合には失敗します。 そのような範囲は表現できないからです。 多重範囲引数を取り、多重範囲を返す別の和と差の演算子があり、引数が隣接していなくても失敗しません。 隣接しないかもしれない範囲の和あるいは差の演算が必要なら、まず範囲を多重範囲にキャストすることによってエラーを避けることができます。

表 9.57に範囲型で利用可能な関数を示します。 表 9.58に多重範囲型で利用可能な関数を示します。

表9.57 範囲関数

関数

説明

lower ( anyrange ) → anyelement

範囲の下限を取り出します。(範囲が空か下限がない場合NULLとなります。)

lower(numrange(1.1,2.2))1.1

upper ( anyrange ) → anyelement

範囲の上限を取り出します。(範囲が空か上限がない場合はNULLとなります。)

upper(numrange(1.1,2.2))2.2

isempty ( anyrange ) → boolean

範囲は空か?

isempty(numrange(1.1,2.2))f

lower_inc ( anyrange ) → boolean

範囲の下限は境界を含むか?

lower_inc(numrange(1.1,2.2))t

upper_inc ( anyrange ) → boolean

範囲の上限は境界を含むか?

upper_inc(numrange(1.1,2.2))f

lower_inf ( anyrange ) → boolean

範囲に下限があるか? (-Infinityの下限は偽を返します。)

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

upper_inf ( anyrange ) → boolean

範囲に上限はあるか? (Infinityの上限は偽を返します。)

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

range_merge ( anyrange, anyrange ) → anyrange

与えられた両方の範囲を含む最小の範囲を計算します。

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


表9.58 多重範囲関数

関数

説明

lower ( anymultirange ) → anyelement

多重範囲の下限を取り出します。(多重範囲が空か下限がない場合はNULLとなります。)

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

upper ( anymultirange ) → anyelement

多重範囲の上限を取り出します。(多重範囲が空か上限がない場合はNULLとなります。)

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

isempty ( anymultirange ) → boolean

多重範囲は空か?

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

lower_inc ( anymultirange ) → boolean

多重範囲の下限は境界を含むか?

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

upper_inc ( anymultirange ) → boolean

多重範囲の上限は境界を含むか?

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

lower_inf ( anymultirange ) → boolean

多重範囲は下限があるか? (-Infinityの下限は偽を返します。)

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

upper_inf ( anymultirange ) → boolean

多重範囲は上限があるか? (Infinityの上限は偽を返します。)

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

range_merge ( anymultirange ) → anyrange

与えられた多重範囲全体を含む最小の範囲を計算します。

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

multirange ( anyrange ) → anymultirange

ちょうど与えられた範囲を含む多重範囲を返す。

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

unnest ( anymultirange ) → setof anyrange

多重範囲を範囲の集合に拡張します。 範囲は格納順で読み出されます(昇順)。

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

 [1,2)
 [3,4)


lower_incupper_inclower_infupper_infはすべて空の多重範囲に対して偽を返します。