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?


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:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.