AnalyticDB for PostgreSQL は、PostgreSQL の範囲関数および演算子をサポートしています。これらの機能を活用して、範囲値の比較、フィルター処理、検査を行います。たとえば、指定されたタイムウィンドウと重複するすべての予約を検索したり、価格が割引範囲内に収まっているかどうかを確認したりできます。
PostgreSQL の完全な仕様については、「範囲関数および演算子」をご参照ください。
範囲演算子
範囲演算子は、範囲式に対して動作し、指定された型の結果を返します。
| オペレーター | シグネチャ | 説明 | 例 | 結果 |
|---|---|---|---|---|
= | anyrange = anyrange → boolean | 2 つの範囲が等しいかどうかをチェックします。 | int4range(1,5) = '[1,4]'::int4range | t |
<> | anyrange <> anyrange → boolean | 2 つの範囲が等しくないかどうかをチェックします。 | numrange(1.1,2.2) <> numrange(1.1,2.3) | t |
< | anyrange < anyrange → boolean | 左側の範囲が右側の範囲より小さいかどうかをチェックします。 | int4range(1,10) < int4range(2,3) | t |
> | anyrange > anyrange → boolean | 左側の範囲が右側の範囲より大きいかどうかをチェックします。 | int4range(1,10) > int4range(1,5) | t |
<= | anyrange <= anyrange → boolean | 左側の範囲が右側の範囲以下であるかどうかをチェックします。 | numrange(1.1,2.2) <= numrange(1.1,2.2) | t |
>= | anyrange >= anyrange → boolean | 左側の範囲が右側の範囲以上であるかどうかをチェックします。 | numrange(1.1,2.2) >= numrange(1.1,2.0) | t |
@> | anyrange @> anyrange → boolean | 左側の範囲が右側の範囲を含むかどうかをチェックします。 | int4range(2,4) @> int4range(2,3) | t |
@> | anyrange @> anyelement → boolean | 左側の範囲が要素を含むかどうかをチェックします。 | '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp | t |
<@ | anyrange <@ anyrange → boolean | 左側の範囲が右側の範囲内に収まっているかどうかをチェックします。 | int4range(2,4) <@ int4range(1,7) | t |
<@ | anyelement <@ anyrange → boolean | 要素が有効値の範囲内に収まっているかを確認します。 | 42 <@ int4range(1,7) | f |
&& | anyrange && anyrange → boolean | 2 つの範囲が重複している(少なくとも 1 つのポイントを共有している)かどうかをチェックします。 | int8range(3,7) && int8range(4,12) | t |
<< | anyrange << anyrange → boolean | 左側の範囲が右側の範囲より厳密に左に位置し、重複がないかどうかをチェックします。 | int8range(1,10) << int8range(100,110) | t |
>> | anyrange >> anyrange → boolean | 左側の範囲が右側の範囲より厳密に右に位置し、重複がないかどうかをチェックします。 | int8range(50,60) >> int8range(20,30) | t |
&< | anyrange &< anyrange → boolean | 左側の範囲が右側の範囲の右端を超えて拡張していないかどうかをチェックします。 | int8range(1,20) &< int8range(18,20) | t |
&> | anyrange &> anyrange → boolean | 左側の範囲が右側の範囲の左端を超えて拡張していないかどうかをチェックします。 | int8range(7,20) &> int8range(5,10) | t |
-|- | anyrange -|- anyrange → boolean | 2 つの範囲が隣接している(エンドポイントでちょうど 1 点で接触し、隙間がない)かどうかをチェックします。 | numrange(1.1,2.2) -|- numrange(2.2,3.3) | t |
+ | anyrange + anyrange → anyrange | 2 つの範囲の和集合を返します。 | numrange(5,15) + numrange(10,20) | [5,20) |
* | anyrange * anyrange → anyrange | 2 つの範囲の共通部分(積集合)を返します。 | int8range(5,15) * int8range(10,20) | [10,15) |
- | anyrange - anyrange → anyrange | 2 つの範囲の差 (左側マイナス右側) を返します。 | int8range(5,15) - int8range(10,20) | [5,10) |
使用上の注意事項
比較演算子(`<`、`>`、`<=`、`>=`) は、まず下限を比較し、下限が等しい場合は上限を比較します。これらの比較は、範囲列に対する B ツリーインデックスの構築をサポートしますが、ほとんどのビジネスクエリでは意味を持たない場合があります。
位置演算子(`<<`、`>>`、`-|-`) は、いずれかのオペランドが空の範囲である場合、常に false を返します。空の範囲は、他の任意の範囲よりも前・後・隣接しているとは見なされません。
和集合(`+`)および差集合(`-`) は、結果が 2 つ以上の分離したサブ範囲を含む場合に失敗します。これは、単一の範囲型では不連続な集合を表現できないためです。たとえば、int8range(1,5) + int8range(10,15) はエラーを発生させます。
範囲関数
範囲関数は、範囲の境界値を返す、範囲の特性をチェックする、または範囲をマージする処理を行います。
| 関数 | 戻り値の型 | 説明 | 例 | 結果 |
|---|---|---|---|---|
lower(anyrange) | 要素のデータの型 | 範囲の下限を返します。 | lower(numrange(1.1,2.2)) | 1.1 |
upper(anyrange) | 要素のデータの型 | 範囲の上限を返します。 | upper(numrange(1.1,2.2)) | 2.2 |
isempty(anyrange) | boolean | 範囲が空であるかどうかをチェックします。 | isempty(numrange(1.1,2.2)) | false |
lower_inc(anyrange) | boolean | 下限が包含的(inclusive)であるかどうかをチェックします。 | lower_inc(numrange(1.1,2.2)) | true |
upper_inc(anyrange) | boolean | 上限が包含的(inclusive)であるかどうかをチェックします。 | upper_inc(numrange(1.1,2.2)) | false |
lower_inf(anyrange) | boolean | 下限が無限大であるかどうかをチェックします。 | lower_inf('(,)'::daterange) | true |
upper_inf(anyrange) | boolean | 上限が無限大であるかどうかをチェックします。 | upper_inf('(,)'::daterange) | true |
range_merge(anyrange, anyrange) | anyrange | 入力された 2 つの範囲を両方含む最小の範囲を返します。 | range_merge('[1,2)'::int4range, '[3,4)'::int4range) | [1,4) |