Heute quatschen wir ein bisschen über Arrays – eines der mächtigsten Tools in PostgreSQL, mit dem du eine Liste von Werten eines Typs in einer einzigen Spalte speichern kannst. Wir schauen uns Arrays später noch ausführlicher an.
Wenn man "Arrays" hört, denkt man sofort an Listen. Denk mal daran, wie du eine Einkaufsliste schreibst, bevor du in den Laden gehst: Äpfel, Bananen, Milch, Brot. In PostgreSQL ist ein Array sowas wie diese Liste, wo du mehrere Werte in einem Feld speichern kannst, wobei jeder Wert denselben Datentyp hat. Zum Beispiel ein Array von Zahlen, ein Array von Texten, ein Array von Daten usw.
Hier ein paar Beispiele.
Array von Zahlen:
{1, 2, 3, 4}
Array von Strings:
{"apple", "banana", "cherry"}
Array von Daten:
{2024-10-01, 2024-10-02, 2024-10-03}
Mit Arrays kannst du viele Werte in einem Feld speichern, sparst Platz in der Tabelle und bekommst mehr Flexibilität bei Abfragen.
Wozu braucht man Arrays? Die wichtigsten Vorteile
Kompakte Datenspeicherung: Mehrere Werte in einem Feld speichern. Das ist besonders praktisch für Daten, die logisch zusammengehören. Zum Beispiel eine Liste von Tags für einen Artikel oder eine Liste von Noten für einen Studenten. Extra eine Tabelle für ein paar Tags anlegen?
Bequeme Abfragen: Mit Arrays kannst du direkt eine ganze Liste von Werten aus einem Feld holen und auch easy einzelne Elemente aus dem Array bearbeiten.
Performance: In manchen Fällen kannst du dir mit Arrays zusätzliche Tabellen für verbundene Daten sparen, was die Datenbankstruktur vereinfacht und die Entwicklung beschleunigt. Wer freut sich da nicht drüber?
Wie arbeitet man mit Arrays in PostgreSQL?
Array in SELECT erstellen
Um ein Array zu erstellen, benutzt man den ARRAY[]-Konstruktor. Hier ein Beispiel:
-- Beispiel für ein Array von Zahlen
SELECT ARRAY[1, 2, 3, 4];
-- Beispiel für ein Array von Strings
SELECT ARRAY['apple', 'banana', 'cherry'];
Ziemlich einfach, oder? Lass uns mal eine Tabelle anlegen und darin was auswählen.
Tabelle mit Arrays erstellen
Erstmal legen wir eine Tabelle an, in der eine der Spalten ein Array ist.
| id | name - VARCHAR(50) | subjects - TEXT[] |
|---|---|---|
| 1 | Alex | {Mathematik,Physik} |
| 2 | Maria | {Chemie,Biologie,Englisch} |
| 3 | Peter | {Informatik} |
Schauen wir mal, was dabei rausgekommen ist:
SELECT * FROM students;
| id | name | subjects |
|---|---|---|
| 1 | Alex | {Mathematik,Physik} |
| 2 | Maria | {Chemie,Biologie,Englisch} |
| 3 | Peter | {Informatik} |
Daten aus Arrays extrahieren
Um Daten aus einem Array zu holen, gibt es in PostgreSQL verschiedene Funktionen und Operatoren.
Element aus Array extrahieren
Um ein Element aus einem Array per Index zu bekommen, benutzt man eckige Klammern []. Achtung: Die Zählung startet bei 1 (nicht bei 0 wie in den meisten Programmiersprachen).
-- Das erste Fach von jedem Studenten holen
SELECT name, subjects[1] AS erstes_fach FROM students;
Und das ist das Ergebnis:
| name | erstes_fach |
|---|---|
| Alex | Mathematik |
| Maria | Chemie |
| Peter | Informatik |
Ganze Zeile aus Array extrahieren
Um alle Elemente eines Arrays zu bekommen, benutzt man einfach ein normales SELECT:
SELECT name, subjects FROM students;
Werte im Array suchen
Manchmal willst du wissen, ob ein Array einen bestimmten Wert enthält. Dafür gibt's den Operator ANY.
-- Studenten auswählen, die "Mathematik" lernen
SELECT name
FROM students
WHERE 'Mathematik' = ANY(subjects);
Das Ergebnis der Abfrage:
| name |
|---|
| Alex |
In PostgreSQL gibt's noch viel mehr Funktionen und Operatoren für Arrays, aber das lernst du in späteren Levels :P
Typische Fehler bei der Arbeit mit Arrays
Verwechslung von 0- und 1-basiertem Index.
In PostgreSQL startet die Array-Indizierung bei 1. Wenn du an Sprachen wie Python oder JavaScript gewöhnt bist, kann das verwirrend sein.
Leere Arrays.
Ein leeres Array {} und NULL sind in PostgreSQL zwei verschiedene Dinge. Wenn du Arrays vergleichst, verwechsle das nicht.
Arbeiten mit großen Arrays.
Wenn du riesige Datenmengen in einem Array speicherst, kann das die Abfragezeiten erhöhen. Nutze Arrays lieber für kleinere Datenmengen.
GO TO FULL VERSION