Zum Inhalt springen

Map-Typ

MAPs ähneln STRUCTs darin, dass sie eine geordnete Liste von Schlüssel-Wert-Paaren sind. MAPs müssen jedoch nicht in jeder Zeile dieselben Schlüssel haben und eignen sich daher für Fälle, in denen das Schema vorher unbekannt ist oder pro Zeile variiert.

MAPs müssen einen einzigen Typ für alle Schlüssel und einen einzigen Typ für alle Werte haben. Schlüssel und Werte können beliebige Typen sein, und der Typ der Schlüssel muss nicht mit dem Typ der Werte übereinstimmen (z. B. ist ein MAP von VARCHAR nach INT gültig). MAPs dürfen keine doppelten Schlüssel haben. MAPs liefern NULL, wenn ein Schlüssel nicht gefunden wird, statt wie Structs einen Fehler zu werfen.

Im Gegensatz dazu müssen STRUCTs String-Schlüssel haben, aber jeder Wert kann einen anderen Typ haben. Einen Vergleich der verschachtelten Datentypen finden Sie im Überblick zu den Datentypen.

Um ein MAP zu konstruieren, verwenden Sie die Klammer-Syntax mit vorangestelltem Schlüsselwort MAP.

Maps erstellen

Ein Map mit VARCHAR-Schlüsseln und INTEGER-Werten. Das liefert {key1=10, key2=20, key3=30}:

SELECT MAP {'key1': 10, 'key2': 20, 'key3': 30};

Alternativ die Funktion map_from_entries verwenden. Das liefert {key1=10, key2=20, key3=30}:

SELECT map_from_entries([('key1', 10), ('key2', 20), ('key3', 30)]);

Ein Map kann auch aus zwei Listen erzeugt werden: Schlüssel und Werte. Das liefert {key1=10, key2=20, key3=30}:

SELECT MAP(['key1', 'key2', 'key3'], [10, 20, 30]);

Ein Map kann auch INTEGER-Schlüssel und NUMERIC-Werte verwenden. Das liefert {1=42.001, 5=-32.100}:

SELECT MAP {1: 42.001, 5: -32.1};

Schlüssel und/oder Werte können auch verschachtelte Typen sein. Das liefert {[a, b]=[1.1, 2.2], [c, d]=[3.3, 4.4]}:

SELECT MAP {['a', 'b']: [1.1, 2.2], ['c', 'd']: [3.3, 4.4]};

Eine Tabelle mit einer Map-Spalte anlegen, die INTEGER-Schlüssel und DOUBLE-Werte hat:

CREATE TABLE tbl (col MAP(INTEGER, DOUBLE));

Aus Maps lesen

MAP-Werte können mit der Funktion map_extract_value oder der Klammer-Notation gelesen werden:

SELECT MAP {'key1': 5, 'key2': 43}['key1'];
5

Hat der Schlüssel den falschen Typ, wird ein Fehler geworfen. Hat er den richtigen Typ, ist aber lediglich nicht im Map enthalten, wird ein NULL-Wert geliefert:

SELECT MAP {'key1': 5, 'key2': 43}['key3'];
NULL

Die Funktion map_extract (und ihr Synonym element_at) kann verwendet werden, um einen Wert in einer Liste verpackt zu lesen; sie liefert eine leere Liste, wenn der Schlüssel nicht im Map enthalten ist:

SELECT map_extract(MAP {'key1': 5, 'key2': 43}, 'key1');
[5]
SELECT MAP {'key1': 5, 'key2': 43}['key3'];
[]

Vergleichsoperatoren

Verschachtelte Typen können mit allen Vergleichsoperatoren verglichen werden. Diese Vergleiche können in logischen Ausdrücken für WHERE- und HAVING-Klauseln sowie zum Erzeugen von Boolean-Werten verwendet werden.

Die Ordnung ist positionsbezogen definiert, analog zur Ordnung von Wörtern in einem Wörterbuch. NULL-Werte sind größer als alle anderen Werte und untereinander gleich.

Auf oberster Ebene gelten für NULL-Werte verschachtelter Typen die üblichen SQL-NULL-Vergleichsregeln: Der Vergleich eines NULL-Werts eines verschachtelten Typs mit einem Nicht-NULL-Wert eines verschachtelten Typs liefert NULL. Der Vergleich von Membern verschachtelter Werte verwendet hingegen die internen Regeln für NULLs in verschachtelten Werten, und ein NULL-Member eines verschachtelten Werts gilt als größer als ein Nicht-NULL-Member.

Funktionen

Siehe Map-Funktionen.