A volte ti trovi in situazioni dove devi capire se un insieme di valori è contenuto in un altro, se si incrociano, se sono uguali o se uno è un sottoinsieme dell'altro. Per esempio:
- L'utente ha accesso a certe categorie?
- Quali prodotti hanno tag in comune?
- Quali array contengono tutti i valori elencati?
Questi problemi si risolvono con gli operatori di confronto degli array in PostgreSQL: =, @>, <@ e &&. Vediamo ognuno di questi operatori con esempi pratici.
= — Confronto di array per uguaglianza
Questo operatore serve per verificare se due array sono identici. La condizione restituisce TRUE solo se entrambi gli array hanno la stessa lunghezza e la stessa sequenza di elementi nello stesso ordine.
Esempio:
SELECT ARRAY[1, 2, 3] = ARRAY[1, 2, 3] AS sono_uguali; -- TRUE
SELECT ARRAY[1, 2, 3] = ARRAY[3, 2, 1] AS sono_uguali; -- FALSE
Attenzione: l'ordine degli elementi conta. L'array [1, 2, 3] non è uguale a [3, 2, 1].
@> — Un array contiene un altro array
Questo operatore controlla se un array contiene tutti gli elementi di un altro array (l'ordine non importa). È spesso usato quando vuoi essere sicuro che tutti gli elementi richiesti siano presenti.
Esempio:
SELECT ARRAY[1, 2, 3] @> ARRAY[1, 2] AS contiene; -- TRUE
SELECT ARRAY[1, 2, 3] @> ARRAY[4] AS contiene; -- FALSE
Scenario utile: controllo dei permessi. Per esempio, vuoi essere sicuro che un certo ruolo includa tutte le autorizzazioni necessarie.
<@ — Un array è sottoinsieme di un altro array
È l'opposto dell'operatore @>. Controlla se un array è completamente contenuto in un altro array.
Esempio:
SELECT ARRAY[1, 2] <@ ARRAY[1, 2, 3] AS e_sottoinsieme; -- TRUE
SELECT ARRAY[4] <@ ARRAY[1, 2, 3] AS e_sottoinsieme; -- FALSE
Scenario utile: quando vuoi verificare se una certa riga della tabella ha tutte le etichette o categorie richieste.
&& — Intersezione di array
Questo operatore controlla se due array si incrociano, cioè se hanno almeno un elemento in comune.
Esempio:
SELECT ARRAY[1, 2, 3] && ARRAY[3, 4, 5] AS si_incrociano; -- TRUE
SELECT ARRAY[1, 2, 3] && ARRAY[6, 7, 8] AS si_incrociano; -- FALSE
Scenario utile: trovare prodotti o record che hanno categorie o caratteristiche in comune.
Uso degli operatori per filtrare i dati
Vediamo come usare questi operatori per filtrare i dati in una tabella. Per esempio, abbiamo una tabella products con una colonna tags che contiene un array di tag per ogni prodotto.
Esempio di tabella products
| id | name | tags |
|---|---|---|
| 1 | "Product A" | {electronics, sale} |
| 2 | "Product B" | {home, sale} |
| 3 | "Product C" | {electronics, new} |
| 4 | "Product D" | {home, garden} |
Troviamo tutti i prodotti che hanno il tag electronics.
SELECT *
FROM products
WHERE tags @> ARRAY['electronics'];
Risultato:
| id | name | tags |
|---|---|---|
| 1 | "Product A" | {electronics, sale} |
| 3 | "Product C" | {electronics, new} |
Vogliamo trovare i prodotti che hanno esattamente i tag {home, sale}.
SELECT *
FROM products
WHERE tags = ARRAY['home', 'sale'];
Risultato:
| id | name | tags |
|---|---|---|
| 2 | "Product B" | {home, sale} |
Ora
troviamo i prodotti che hanno almeno uno dei tag {sale, new}.SELECT *
FROM products
WHERE tags && ARRAY['sale', 'new'];
Risultato:
| id | name | tags |
|---|---|---|
| 1 | "Product A" | {electronics, sale} |
| 2 | "Product B" | {home, sale} |
| 3 | "Product C" | {electronics, new} |
Cerchiamo i prodotti dove i tag sono esattamente limitati a {home, garden}.
SELECT *
FROM products
WHERE tags <@ ARRAY['home', 'garden'];
Risultato:
| id | name | tags |
|---|---|---|
| 4 | "Product D" | {home, garden} |
Esempio: controllo del contenuto degli array con CASE
Possiamo combinare il confronto degli array con le espressioni condizionali. Per esempio, creiamo una query che segna i prodotti che hanno il tag sale come "Sconto", e gli altri come "Senza sconto":
SELECT name,
CASE
WHEN tags @> ARRAY['sale'] THEN 'Sconto'
ELSE 'Senza sconto'
END AS stato_sconto
FROM products;
Risultato:
| name | stato_sconto |
|---|---|
| "Product A" | Sconto |
| "Product B" | Sconto |
| "Product C" | Senza sconto |
| "Product D" | Senza sconto |
Errori tipici e come evitarli
Errore: uso sbagliato dell'ordine degli elementi con l'operatore =. Ricorda che = richiede che l'ordine degli elementi sia esattamente lo stesso. Se l'ordine non ti interessa, usa @> o &&.
Errore: tipi di dati non corrispondenti. Gli array devono essere dello stesso tipo. Per esempio, ARRAY['1', '2'] non è uguale a ARRAY[1, 2], perché il primo è un array di stringhe e il secondo è numerico. Controlla sempre i tipi prima di confrontare.
Errore: mancanza di indici. Se filtri spesso le righe usando gli array, crea sempre indici (GIN) per migliorare le performance.
Questi operatori ti permettono di fare filtraggio e confronto potenti sui dati, utili in tanti casi reali: dall'analisi dei tag dei prodotti alla gestione dei permessi di accesso. Usandoli bene, puoi semplificare compiti complessi e ottimizzare le tue query.
GO TO FULL VERSION