CodeGym /Kurse /SQL SELF /Vergleich und Filterung von Arrays: =, @>, <@, &...

Vergleich und Filterung von Arrays: =, @>, <@, &&

SQL SELF
Level 36 , Lektion 1
Verfügbar

Manchmal gibt's Situationen, wo du checken willst, ob eine Menge von Werten in einer anderen enthalten ist, ob sie sich überschneiden, gleich sind oder ob das eine ein Subset vom anderen ist. Zum Beispiel:

  • Hat ein User Zugriff auf bestimmte Kategorien?
  • Welche Produkte haben gemeinsame Tags?
  • Welche Arrays enthalten alle aufgelisteten Werte?

Solche Aufgaben löst du mit den Array-Vergleichsoperatoren in PostgreSQL: =, @>, <@ und &&. Wir schauen uns jeden dieser Operatoren mit Beispielen an.

= — Arrays auf Gleichheit prüfen

Mit diesem Operator prüfst du, ob zwei Arrays identisch sind. Die Bedingung gibt TRUE zurück, wenn beide Arrays die gleiche Länge und die gleichen Elemente in exakt der gleichen Reihenfolge haben.

Beispiel:

SELECT ARRAY[1, 2, 3] = ARRAY[1, 2, 3] AS sind_gleich;  -- TRUE
SELECT ARRAY[1, 2, 3] = ARRAY[3, 2, 1] AS sind_gleich;  -- FALSE

Wichtig: Die Reihenfolge der Elemente zählt. Das Array [1, 2, 3] ist nicht gleich [3, 2, 1].

@> — Array enthält ein anderes Array

Mit diesem Operator prüfst du, ob ein Array alle Elemente eines anderen Arrays enthält (Reihenfolge egal). Wird oft genutzt, wenn du sicherstellen willst, dass alle gesuchten Elemente vorhanden sind.

Beispiel:

SELECT ARRAY[1, 2, 3] @> ARRAY[1, 2] AS enthaelt;  -- TRUE
SELECT ARRAY[1, 2, 3] @> ARRAY[4] AS enthaelt;     -- FALSE

Nützliches Szenario: Rechte-Check. Zum Beispiel willst du prüfen, ob eine bestimmte Rolle alle nötigen Berechtigungen hat.

<@ — Array ist Subset eines anderen Arrays

Das Gegenteil von @>. Prüft, ob ein Array komplett in einem anderen Array enthalten ist.

Beispiel:

SELECT ARRAY[1, 2] <@ ARRAY[1, 2, 3] AS ist_subset;  -- TRUE
SELECT ARRAY[4] <@ ARRAY[1, 2, 3] AS ist_subset;     -- FALSE

Nützliches Szenario: Wenn du checken willst, ob eine bestimmte Tabellenzeile alle nötigen Labels oder Kategorien hat.

&& — Schnittmenge von Arrays

Mit diesem Operator prüfst du, ob zwei Arrays sich überschneiden, also mindestens ein gemeinsames Element haben.

Beispiel:

SELECT ARRAY[1, 2, 3] && ARRAY[3, 4, 5] AS schneidet_sich;  -- TRUE
SELECT ARRAY[1, 2, 3] && ARRAY[6, 7, 8] AS schneidet_sich;  -- FALSE

Nützliches Szenario: Suche nach Produkten oder Einträgen mit gemeinsamen Kategorien oder Eigenschaften.

Operatoren beim Filtern von Daten nutzen

Jetzt wenden wir die Operatoren mal beim Filtern von Daten in einer Tabelle an. Stell dir vor, wir haben eine Tabelle products mit einer Spalte tags, die ein Array von Tags für jedes Produkt enthält.

Beispiel-Tabelle products

id name tags
1 "Produkt A" {elektronik, rabatt}
2 "Produkt B" {zuhause, rabatt}
3 "Produkt C" {elektronik, neu}
4 "Produkt D" {zuhause, garten}

Wir suchen alle Produkte, die das Tag elektronik haben.

SELECT *
FROM products
WHERE tags @> ARRAY['elektronik'];

Ergebnis:

id name tags
1 "Produkt A" {elektronik, rabatt}
3 "Produkt C" {elektronik, neu}

Wir wollen Produkte finden, deren Tags genau {zuhause, rabatt} sind.

SELECT *
FROM products
WHERE tags = ARRAY['zuhause', 'rabatt'];

Ergebnis:

id name tags
2 "Produkt B" {zuhause, rabatt}

Und jetzt

finden wir Produkte, die mindestens eines der Tags {rabatt, neu} haben.
SELECT *
FROM products
WHERE tags && ARRAY['rabatt', 'neu'];

Ergebnis:

id name tags
1 "Produkt A" {elektronik, rabatt}
2 "Produkt B" {zuhause, rabatt}
3 "Produkt C" {elektronik, neu}

Wir suchen Produkte, deren Tags genau auf {zuhause, garten} beschränkt sind.

SELECT *
FROM products
WHERE tags <@ ARRAY['zuhause', 'garten'];

Ergebnis:

id name tags
4 "Produkt D" {zuhause, garten}

Beispiel: Listen-Inhalte mit CASE prüfen

Wir können Array-Vergleiche auch mit Bedingungen kombinieren. Zum Beispiel machen wir ein Query, das Produkte mit dem Tag rabatt als "Rabatt" markiert und alle anderen als "Ohne Rabatt":

SELECT name,
       CASE
         WHEN tags @> ARRAY['rabatt'] THEN 'Rabatt'
         ELSE 'Ohne Rabatt'
       END AS rabatt_status
FROM products;

Ergebnis:

name rabatt_status
"Produkt A" Rabatt
"Produkt B" Rabatt
"Produkt C" Ohne Rabatt
"Produkt D" Ohne Rabatt

Typische Fehler und wie du sie vermeidest

Fehler: Falsche Reihenfolge der Elemente beim Operator =. Denk dran: = verlangt exakt die gleiche Reihenfolge der Elemente. Wenn die Reihenfolge egal ist, nutz lieber @> oder &&.

Fehler: Unterschiedliche Datentypen. Arrays müssen vom gleichen Typ sein. Zum Beispiel ist ARRAY['1', '2'] nicht gleich ARRAY[1, 2], weil das erste ein String-Array ist und das zweite ein Zahlen-Array. Check immer die Typen vorm Vergleichen.

Fehler: Keine Indizes. Wenn du oft nach Arrays filterst, leg unbedingt Indizes (GIN) an, damit deine Queries schneller laufen.

Mit diesen Operatoren kannst du richtig mächtige Filter und Vergleiche bauen, die du in echten Projekten ständig brauchst: Von Tag-Analyse bei Produkten bis zum Rechte-Management. Wenn du sie clever einsetzt, werden viele Aufgaben einfacher und deine Queries laufen flotter.

2
Aufgabe
SQL SELF, Level 36, Lektion 1
Gesperrt
Überprüfung des Inhalts eines Arrays mit dem Operator `@>`
Überprüfung des Inhalts eines Arrays mit dem Operator `@>`
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION