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.
GO TO FULL VERSION