web-dev-qa-db-ja.com

1ベースの配列を使用しているにもかかわらず、PostgreSQLがarray [0]のクエリを許可するのはなぜですか?

私は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番目の要素のクエリが許可され、結果に意味がありますか?

7
Adam Matan

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を取得します。

関連:

11