Warum erlaubt PostgreSQL das Abfragen von Array [0], obwohl es 1-basierte Arrays verwendet?

7

Ich habe mit Arrays in einer meiner PostgreSQL-Datenbanken gespielt.

Ich habe eine Tabelle mit einem Geometriearray mit mindestens einem Element erstellt:

CREATE TABLE test_arrays (
    polygons geometry(Polygon,4326)[],
    CONSTRAINT non_empty_polygons_chk 
        CHECK ((COALESCE(array_length(polygons, 1), 0) <> 0))
);

Ich habe einige Zeilen hinzugefügt und die Tabelle nach dem ersten Element in jedem Geometriearray abgefragt:

SELECT polygons[0] FROM test_arrays;

Zu meiner Überraschung habe ich eine Liste mit leeren Zeilen bekommen!

Nach einigen Recherchen stellt sich heraus, dass PostgreSQL-Arrays einsbasiert sind :

Die Array-Indexnummern sind in eckigen Klammern angegeben. Standardmäßig verwendet PostgreSQL eine einbasierte Nummerierungskonvention für Arrays, dh ein Array von n Elementen beginnt mit Array [1] und endet mit Array [n].

Also SELECT polygons[0] FROM test_arrays;arbeitete und gab den ersten polygonjeder Reihe zurück.

Wenn PostgreSQL eine einbasierte Nummerierungskonvention verwendet, warum ist das Abfragen des 0. Elements zulässig und hat das Ergebnis eine Bedeutung?

Adam Matan
quelle
1
Lesen Sie diese Seite bis zum Ende: " Außerdem wird null zurückgegeben, wenn sich ein Index außerhalb der Array-Grenzen befindet (dieser Fall löst keinen Fehler aus) "
a_horse_with_no_name
@a_horse_with_no_name Richtig und danke. Ich vermute, dass dieses Entwurfsprinzip Abfragen zum Auslösen von Fehlern und zum Beenden von Transaktionen aufgrund von Indexinkongruenzen stoppen soll.
Adam Matan

Antworten:

11

Postgres-Arrays basieren standardmäßig auf 1. In typischen Anwendungen ist es am besten, die Standardeinstellung beizubehalten. Die Syntax erlaubt es jedoch, mit einer beliebigen integer Zahl zu beginnen . Die Dokumentation:

Die tiefgestellte Zuweisung ermöglicht die Erstellung von Arrays, die keine einbasierten Indizes verwenden. Zum Beispiel könnte man zuweisen, myarray[-2:7]um ein Array mit tiefgestellten Werten von -2 bis 7 zu erstellen.

Beispiele:

SELECT ('[0:2]={1,2,3}'::int[])[0];    --> 1
SELECT ('[-7:-5]={1,2,3}'::int[])[-6]; --> 2 

Sie können einen beliebigen Index eines Arrays abfragen. Wenn dieser nicht vorhanden ist, erhalten Sie NULL.

Verbunden:

Erwin Brandstetter
quelle