私はPostgreSQLデータベースの1つで配列を操作しています。
少なくとも1つの要素を持つジオメトリ配列でテーブルを作成しました:
CREATE TABLE test_arrays (
polygons geometry(Polygon,4326)[],
CONSTRAINT non_empty_polygons_chk
CHECK ((COALESCE(array_length(polygons, 1), 0) <> 0))
);
いくつかの行を追加し、各ジオメトリ配列の最初の要素についてテーブルをクエリしました。
SELECT polygons[0] FROM test_arrays;
驚いたことに、空の行のリストを取得しました。
調査の結果、 PostgreSQL配列は1ベース であることがわかりました。
配列の添え字番号は角括弧内に記述されます。デフォルトでは、PostgreSQLは配列に1ベースの番号付け規則を使用します。つまり、n要素の配列はarray [1]で始まり、array [n]で終わります。
そう SELECT polygons[0] FROM test_arrays;
は機能し、各行の最初のpolygon
を返しました。
PostgreSQLが1ベースの番号付け規則を使用している場合、なぜ0番目の要素のクエリが許可され、結果に意味がありますか?
Postgres配列はデフォルトで1ベースです。また、一般的なアプリケーションでは、デフォルトを使用するのが最善です。ただし、この構文では、anyinteger
numberで始めることができます。 ドキュメント:
添え字付き割り当てでは、1ベースの添え字を使用しない配列を作成できます。たとえば、
myarray[-2:7]
は、-2から7までの添え字値を持つ配列を作成します。
例:
SELECT ('[0:2]={1,2,3}'::int[])[0]; --> 1
SELECT ('[-7:-5]={1,2,3}'::int[])[-6]; --> 2
配列のanyインデックスを照会できます。存在しない場合はNULLを取得します。
関連: