Arrays werden oft genutzt, um mehrere Werte in einer Spalte zu speichern – egal ob Tags, Nummern, Rollen oder Vorlieben. Aber wie findest du raus, ob ein bestimmter Wert im Array steckt oder ob sogar alle Elemente einer bestimmten Bedingung entsprechen? PostgreSQL hat dafür ziemlich praktische Tools: ANY, ALL und array_contains(). Lass uns die mal der Reihe nach anschauen.
Was ist ANY?
Stell dir vor, du hast ein Array mit mehreren Werten, zum Beispiel Produkt-IDs, Telefonnummern oder eine Liste von Hobbys. Oft willst du wissen, ob ein bestimmter Wert im Array vorkommt. Genau dafür gibt's den Operator ANY. Damit kannst du checken, ob dein "gesuchtes Objekt" im Array enthalten ist.
Syntax von ANY
SELECT *
FROM your_table
WHERE value = ANY(array_column);
Hier gilt:
array_column– das ist das Array, das du prüfst.value– das ist der Wert, den du im Array suchst.
Beispiel für ANY
Angenommen, du hast eine Tabelle students mit folgender Struktur:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {lesen, schwimmen, schach} |
| 2 | Eva | {musik, lesen, sport} |
| 3 | Alex | {zeichnen, musik} |
| 4 | Maria | {schach, fußball} |
Wir suchen jetzt alle Studierenden, die unter ihren Hobbys schwimmen haben. Die Query sieht so aus:
SELECT *
FROM students
WHERE 'schwimmen' = ANY(hobbies);
Ergebnis:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {lesen, schwimmen, schach} |
Kurz gesagt: ANY prüft: "Gibt es diesen Wert im Array?".
Vertrau, aber prüf alles! ALL benutzen
Jetzt das Gegenteil: Du willst sicherstellen, dass alle Elemente im Array einer bestimmten Regel entsprechen. Dafür gibt's in PostgreSQL den Operator ALL. Damit kannst du checken, ob alle Array-Elemente z.B. gleich einem Wert sind, größer als eine Zahl oder irgendeiner anderen logischen Bedingung entsprechen.
Syntax von ALL
SELECT *
FROM your_table
WHERE value < ALL(array_column);
Hier gilt:
array_column– das ist das Array, das du prüfst.value < ALL(...)bedeutet, dass alle Array-Elemente größer als der Wert sein müssen.
Zurück zu unserer students-Tabelle. Angenommen, wir wollen Studierende finden, bei denen alle Hobbys mit "l" anfangen. Die Query:
SELECT *
FROM students
WHERE 'lesen' = ALL(hobbies);
Das Ergebnis ist leer, weil niemand alle Hobbys mit "lesen" hat. Damit das Beispiel klarer (und funktionierend) ist, nehmen wir mal Zahlen.
Angenommen, es gibt eine Tabelle orders:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {100, 200, 300} |
| 2 | Eva | {50, 60, 70} |
| 3 | Alex | {500, 600, 700} |
Finde alle Bestellungen, bei denen jede Position günstiger als 400 ist:
SELECT *
FROM orders
WHERE 400 > ALL(prices);
Ergebnis:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {100, 200, 300} |
| 2 | Eva | {50, 60, 70} |
Zeilen nach Array-Inhalt filtern
Wir haben die grundlegenden Funktionen und Operatoren zum Suchen in Arrays angeschaut, aber wie sieht das in der Praxis aus? Hier ein paar Beispiele.
Beispiel 1: Finde Studierende, die mindestens ein Hobby "musik" haben
Ausgangstabelle:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {lesen, musik, laufen} |
| 2 | Eva | {zeichnen, schwimmen} |
| 3 | Maria | {musik, boxen} |
| 4 | Alex | {fußball, boxen, brettspiele} |
SELECT *
FROM students
WHERE 'musik' = ANY(hobbies);
Ergebnis:
| id | name | hobbies |
|---|---|---|
| 1 | Otto | {lesen, musik, laufen} |
| 3 | Maria | {musik, boxen} |
Beispiel 2: Finde Bestellungen, bei denen alle Preise über 100 liegen
Ausgangstabelle orders:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {150, 200, 300} |
| 2 | Eva | {50, 120, 130} |
| 3 | Maria | {200, 250, 100} |
| 4 | Alex | {110, 115, 120} |
SELECT *
FROM orders
WHERE 100 < ALL(prices);
Ergebnis:
| id | customer | prices |
|---|---|---|
| 1 | Otto | {150, 200, 300} |
| 4 | Alex | {110, 115, 120} |
Typische Fehler und wie du sie vermeidest
Wenn du mit Arrays arbeitest, vor allem beim Suchen, gibt's ein paar Stolperfallen, auf die du achten solltest.
Fehler: Falsche Nutzung von ANY oder ALL. Zum Beispiel, wenn du die Operatoren vertauschst, bekommst du unerwartete Ergebnisse.
-- Falsche Variante:
SELECT *
FROM students
WHERE hobbies = ANY('lesen');
Hier ist der Fehler, dass hobbies ein Array ist, aber 'lesen' ein String. Das Array sollte mit ANY geprüft werden, nicht umgekehrt.
Fehler: Array-Indizierung startet bei 1, nicht bei 0. Wenn du Arrays in anderen Funktionen nutzt oder Elemente manuell rausholst, denk dran: PostgreSQL zählt ab 1.
Fehler: Keine Indizes. Wenn du Arrays oft für Suchen (ANY, ALL) nutzt, kann ein Index die Queries deutlich schneller machen.
GO TO FULL VERSION