CodeGym /Corsi /SQL SELF /Estrazione dei dati da oggetti JSON

Estrazione dei dati da oggetti JSON

SQL SELF
Livello 33 , Lezione 2
Disponibile

JSONB è uno strumento potente che ti permette di salvare strutture dati complesse, tipo oggetti annidati o array. Però non basta solo salvare i dati in JSONB — dobbiamo anche saperli tirare fuori. Tipo, immagina di avere una colonna data nella tabella users, dove sono salvate tutte le impostazioni utente in formato JSONB. Vuoi sapere che tema ha scelto l’utente? Devi estrarlo dall’oggetto JSONB.

Se JSONB è uno scrigno del tesoro, allora gli operatori ->, ->>, #>> e funzioni come jsonb_extract_path() sono le tue chiavi. Vediamo insieme come usarli.

Operatori base per lavorare con JSONB

In PostgreSQL ci sono diversi operatori chiave per lavorare con JSONB. Ti permettono di estrarre valori da chiavi, oggetti annidati e array. Eccoli qui:

Operatore ->

L’operatore -> estrae oggetto o array per una chiave specifica. Se vuoi il valore nello stesso formato JSON, questo è quello che fa per te.

Esempio:

-- Esempio dati
SELECT '{"name": "Alice", "age": 25}'::jsonb -> 'name';
-- Risultato: "Alice"

Operatore ->>

L’operatore ->> è simile a ->, ma restituisce il valore estratto come testo. Utile quando vuoi una versione semplificata e testuale dei dati.

Esempio:

-- Esempio dati
SELECT '{"name": "Alice", "age": 25}'::jsonb ->> 'age';
-- Risultato: "25" (stringa)

Operatore #>>

L’operatore #>> estrae dati da oggetti annidati seguendo un percorso. Il percorso si passa come array di chiavi.

Esempio:

-- Esempio dati
SELECT '{"user": {"name": "Bob", "details": {"age": 30}}}'::jsonb #>> '{user, details, age}';
-- Risultato: "30" (stringa)

Differenza tra -> e ->>:

Se ti interessa mantenere il tipo di dato (tipo array o oggetto), usa ->. Se vuoi solo il testo, vai di ->>.

Uso delle funzioni per lavorare con JSONB

La funzione jsonb_extract_path() estrae un valore da un oggetto JSONB seguendo il percorso che gli dai. È simile all’operatore #>>, ma un po’ più espressiva.

Esempio:

SELECT jsonb_extract_path('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- Risultato: "dark"

Se vuoi subito il valore come testo, usa jsonb_extract_path_text(). Funziona come jsonb_extract_path(), ma restituisce una stringa.

Esempio:

SELECT jsonb_extract_path_text('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- Risultato: dark

Esempi pratici

Estrazione di un valore per chiave. Supponiamo di avere una tabella products, dove nella colonna details ci sono dati in formato JSONB:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT,
    details JSONB
);

INSERT INTO products (name, details) VALUES
    ('Laptop', '{"brand": "Dell", "price": 1200, "specs": {"ram": "16GB", "cpu": "Intel i7"}}'),
    ('Phone', '{"brand": "Apple", "price": 1000, "specs": {"ram": "4GB", "cpu": "A13"}}');

Risultato:

id name details
1 Laptop {"brand": "Dell", "price": 1200, "specs": {"ram": "16GB", "cpu": "Intel i7"}}
2 Phone {"brand": "Apple", "price": 1000, "specs": {"ram": "4GB", "cpu": "A13"}}

Estraiamo i brand di tutti i prodotti.

SELECT name, details->'brand' AS brand FROM products;

Risultato:

name brand
Laptop "Dell"
Phone "Apple"

Estrazione di un valore testuale. Se vuoi il brand senza virgolette, usa l’operatore ->>:

SELECT name, details->>'brand' AS brand FROM products;

Risultato:

name brand
Laptop Dell
Phone Apple

Estrazione di dati annidati. Estraiamo la quantità di RAM (ram) per ogni prodotto:

SELECT name, details#>>'{specs, ram}' AS ram FROM products;

Risultato:

name ram
Laptop 16GB
Phone 4GB

Estrazione dati per percorso. Stessa cosa, ma con la funzione jsonb_extract_path_text():

SELECT name, jsonb_extract_path_text(details, 'specs', 'ram') AS ram FROM products;

Risultato:

name ram
Laptop 16GB
Phone 4GB

Errori tipici e come evitarli

Gli errori capitano spesso quando:

  • Provi a estrarre dati da un percorso sbagliato. Tipo, se la chiave non esiste, il risultato sarà null.
  • Usi l’operatore sbagliato per quello che vuoi fare. -> va bene per oggetti e array, ma per il testo serve ->>.

Esempio di errore:

-- Errore: la chiave 'nonexistent' non esiste
SELECT details->>'nonexistent' FROM products;
-- Risultato: null

Consiglio: controlla sempre la struttura dei dati prima di scrivere le query, così eviti errori.

Applicazioni nel mondo reale

L’estrazione di dati da JSONB si usa in un sacco di applicazioni reali:

  • Nel e-commerce per gestire le caratteristiche dei prodotti.
  • Nei web app per salvare le impostazioni utente.
  • Nell’analisi dati per lavorare con dati strutturati tipo eventi e log.

Ecco un altro esempio. Supponiamo di avere una tabella orders, dove sono salvati i dati degli ordini:

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_name TEXT,
    items JSONB
);

INSERT INTO orders (customer_name, items) VALUES
    ('John', '[{"product": "Laptop", "quantity": 1}, {"product": "Mouse", "quantity": 2}]'),
    ('Alice', '[{"product": "Phone", "quantity": 1}]');

Estraiamo i nomi di tutti i prodotti dagli ordini:

SELECT customer_name, jsonb_array_elements(items)->>'product' AS product FROM orders;

Risultato:

customer_name product
John Laptop
John Mouse
Alice Phone

Più avanti andremo ancora più a fondo con JSONB, esplorando dati annidati e come trasformarli in un formato più comodo per l’analisi. Preparati a scoprire cose ancora più interessanti!

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