CodeGym /Corsi /SQL SELF /Confronto e filtraggio di array: =, @>, <@, &&a...

Confronto e filtraggio di array: =, @>, <@, &&

SQL SELF
Livello 36 , Lezione 1
Disponibile

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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION