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