0Pricing
SQL Academy · Lezione

Cercare all'interno degli array

Operatori ANY, contains e overlap

Cercare all'interno degli array è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Gli array memorizzano più valori

In PostgreSQL, una colonna array contiene più valori in una singola cella. Prima di poter cercare all'interno degli array, è utile vedere che aspetto hanno.

La query seguente crea una tabella in cui ogni prodotto può appartenere a diverse categorie memorizzate come array di testo.

CREATE TABLE products (
  id      SERIAL PRIMARY KEY,
  name    TEXT,
  tags    TEXT[]
);

INSERT INTO products (name, tags) VALUES
  ('Laptop',     ARRAY['electronics', 'computers', 'sale']),
  ('T-Shirt',    ARRAY['clothing', 'summer', 'sale']),
  ('Coffee Mug', ARRAY['kitchen', 'gifts']),
  ('Headphones', ARRAY['electronics', 'audio']),
  ('Notebook',   ARRAY['stationery', 'office']);

Verificare l'appartenenza con ANY

L'operatore ANY consente di verificare se un valore compare in qualsiasi posizione di un array. La sintassi è: value = ANY(array_column).

Questa query trova tutti i prodotti contrassegnati con il tag electronics.

SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);

ANY non serve solo per il testo

ANY funziona con qualsiasi tipo di dato che supporti l'uguaglianza. Ecco una tabella di punteggi memorizzati come array di interi. La query recupera gli studenti che hanno ottenuto il punteggio perfetto di 100 in almeno una prova.

CREATE TABLE students (
  student TEXT,
  scores  INT[]
);

INSERT INTO students VALUES
  ('Alice', ARRAY[88, 95, 100]),
  ('Bob',   ARRAY[70, 80, 90]),
  ('Carol', ARRAY[100, 100, 99]);

SELECT student, scores
FROM students
WHERE 100 = ANY(scores);

Escludere righe con NOT + ANY

Per trovare le righe in cui un valore non compare in un array, combini NOT con ANY. Noti che value <> ANY(arr) ha un significato diverso: restituisce true se un elemento qualsiasi è diverso, il che è quasi sempre vero.

Utilizzi NOT (value = ANY(arr)) per un controllo di esclusione affidabile.

-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));

L'operatore contiene @>

L'operatore @> verifica se un array contiene tutti gli elementi di un altro array. Lo si può interpretare così: l'array di sinistra include ogni elemento elencato a destra?

Questa query trova i prodotti che hanno sia il tag electronics sia il tag sale.

SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];

L'operatore contenuto in <@

L'operatore <@ è il contrario di @>. Verifica se l'array di sinistra è interamente contenuto nell'array di destra.

Questa query trova i prodotti il cui intero elenco di tag è un sottoinsieme dell'insieme electronics, computers, sale.

SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];

L'operatore di sovrapposizione &&

L'operatore && restituisce true quando due array condividono almeno un elemento. È l'equivalente per gli array della domanda: questi due elenchi hanno qualcosa in comune?

La query seguente trova i prodotti che condividono almeno un tag con una determinata lista della spesa.

SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];

Sovrapposizione e contenimento — differenza fondamentale

È facile confondere @> e &&. Ecco un confronto chiaro:

  • tags @> ARRAY['a','b'] — la riga deve contenere sia 'a' sia 'b'.
  • tags && ARRAY['a','b'] — la riga deve contenere almeno uno tra 'a' e 'b'.
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];

-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];

Utilizzare array_length per filtrare in base alla dimensione

A volte è necessario trovare le righe in cui l'array contiene un determinato numero di elementi. array_length(arr, 1) restituisce il numero di elementi nella prima dimensione.

Questa query trova i prodotti con esattamente tre tag.

SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;

Combinare le ricerche negli array con altre condizioni

Gli operatori per gli array funzionano insieme alle normali condizioni SQL. Può combinarli con AND, OR e qualsiasi altro predicato della clausola WHERE per creare filtri precisi.

-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
  AND name < 'N'
ORDER BY name;

Indicizzare gli array per aumentare la velocità

Per le tabelle di grandi dimensioni, le ricerche negli array possono essere lente senza un indice. L'indice GIN (indice invertito generalizzato) di PostgreSQL è progettato per le colonne array e supporta in modo efficiente gli operatori @>, <@ e &&.

ANY non utilizza direttamente un indice GIN, ma gli operatori di sovrapposizione e contenimento sì.

-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);

-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];

Verifica rapida: operatori per gli array

Verifichi la sua comprensione degli operatori di ricerca negli array di PostgreSQL.

Riepilogo della lezione

In questa lezione ha imparato tre modi fondamentali per cercare all'interno degli array di PostgreSQL:

  • = ANY(arr) — verifica se un singolo valore esiste in qualsiasi posizione dell'array.
  • @> (contiene) — verifica che l'array includa tutti gli elementi specificati.
  • && (sovrapposizione) — verifica che l'array condivida almeno un elemento con un altro array.

Ha inoltre visto <@ per il controllo inverso del contenimento, array_length per i filtri basati sulla dimensione e l'indice GIN per velocizzare le ricerche negli array su grandi insiemi di dati. La combinazione di questi operatori con le condizioni WHERE standard offre un controllo preciso ed espressivo sui dati multivalore.

Domande Frequenti

La lezione «Cercare all'interno degli array» è gratuita?

Sì — il testo completo di «Cercare all'interno degli array» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «Cercare all'interno degli array»?

Operatori ANY, contains e overlap Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Cercare all'interno degli array»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Nozioni di base sulle colonne array
  2. Cercare all'interno degli array
  3. UNNEST e aggregazione
  4. Array e tabelle normalizzate a confronto
← Torna a SQL Academy