CodeGym /Kurse /SQL SELF /Datensuche im Array: ANY, ALL...

Datensuche im Array: ANY, ALL, array_contains()

SQL SELF
Level 35 , Lektion 4
Verfügbar

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.

1
Umfrage/Quiz
Arrays und Arbeit mit ihnen, Level 35, Lektion 4
Nicht verfügbar
Arrays und Arbeit mit ihnen
Arrays und Arbeit mit ihnen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION