JSONB, c’est un outil super puissant qui te permet de stocker des structures de données complexes, genre des objets imbriqués ou des tableaux. Mais juste stocker des données en JSONB, ça suffit pas — faut savoir les extraire ! Par exemple, imagine que t’as une colonne data dans la table users où sont stockés tous les paramètres utilisateur au format JSONB. Tu veux savoir quel thème l’utilisateur a choisi ? Va falloir l’extraire de l’objet JSONB.
Si JSONB c’est un coffre au trésor, alors les opérateurs ->, ->>, #>> et les fonctions comme jsonb_extract_path(), c’est tes clés. On va voir comment t’en servir.
Les opérateurs de base pour bosser avec JSONB
PostgreSQL propose plusieurs opérateurs clés pour manipuler du JSONB. Ils permettent d’extraire des valeurs à partir de clés, d’objets imbriqués ou de tableaux. Voilà les principaux :
Opérateur ->
L’opérateur -> extrait un objet ou un tableau selon la clé donnée. Si tu veux récupérer la valeur dans le même format que dans le JSON, c’est celui-là qu’il te faut.
Exemple :
-- Exemple de données
SELECT '{"name": "Alice", "age": 25}'::jsonb -> 'name';
-- Résultat : "Alice"
Opérateur ->>
L’opérateur ->> ressemble à ->, mais il renvoie la valeur extraite sous forme de texte. Pratique si tu veux juste une version texte des données.
Exemple :
-- Exemple de données
SELECT '{"name": "Alice", "age": 25}'::jsonb ->> 'age';
-- Résultat : "25" (chaîne)
Opérateur #>>
L’opérateur #>> extrait des données d’objets imbriqués selon le chemin indiqué. Le chemin est passé sous forme de tableau de clés.
Exemple :
-- Exemple de données
SELECT '{"user": {"name": "Bob", "details": {"age": 30}}}'::jsonb #>> '{user, details, age}';
-- Résultat : "30" (chaîne)
Différence entre -> et ->> :
Si tu veux garder le type de données (genre tableau ou objet), utilise ->. Si tu veux juste du texte, prends ->>.
Utilisation des fonctions pour manipuler JSONB
La fonction jsonb_extract_path() extrait une valeur d’un objet JSONB selon le chemin donné. C’est l’équivalent fonctionnel de l’opérateur #>>, mais un peu plus explicite.
Exemple :
SELECT jsonb_extract_path('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- Résultat : "dark"
Si tu veux direct la valeur en texte, utilise jsonb_extract_path_text(). Elle marche comme jsonb_extract_path(), mais renvoie une chaîne.
Exemple :
SELECT jsonb_extract_path_text('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- Résultat : dark
Exemples pratiques
Extraire une valeur par clé. Imaginons qu’on a une table products où la colonne details contient des données au format 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"}}');
Résultat :
| 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"}} |
On extrait les marques de tous les produits.
SELECT name, details->'brand' AS brand FROM products;
Résultat :
| name | brand |
|---|---|
| Laptop | "Dell" |
| Phone | "Apple" |
Extraction d’une valeur texte. Si tu veux la marque sans les guillemets, utilise l’opérateur ->> :
SELECT name, details->>'brand' AS brand FROM products;
Résultat :
| name | brand |
|---|---|
| Laptop | Dell |
| Phone | Apple |
Extraction de données imbriquées. On extrait la quantité de RAM (ram) pour chaque produit :
SELECT name, details#>>'{specs, ram}' AS ram FROM products;
Résultat :
| name | ram |
|---|---|
| Laptop | 16GB |
| Phone | 4GB |
Extraction de données par chemin. On peut faire pareil avec la fonction jsonb_extract_path_text() :
SELECT name, jsonb_extract_path_text(details, 'specs', 'ram') AS ram FROM products;
Résultat :
| name | ram |
|---|---|
| Laptop | 16GB |
| Phone | 4GB |
Erreurs courantes et comment les éviter
Les erreurs arrivent souvent quand tu :
- Essaies d’extraire des données avec un mauvais chemin. Par exemple, si la clé existe pas, le résultat sera
null. - Utilises le mauvais opérateur pour la tâche.
->c’est pour extraire des objets ou des tableaux, mais pour du texte faut utiliser->>.
Exemple d’erreur :
-- Erreur : la clé 'nonexistent' existe pas
SELECT details->>'nonexistent' FROM products;
-- Résultat : null
Astuce : vérifie toujours la structure des données avant d’écrire tes requêtes, histoire d’éviter les galères.
Utilisation dans des cas réels
L’extraction de données depuis JSONB est utilisée dans plein d’applis réelles :
- En e-commerce pour gérer les caractéristiques des produits.
- Dans les applis web pour stocker les paramètres utilisateur.
- En analytics pour traiter des données structurées, genre des events et des logs.
Encore un exemple. Imaginons qu’on a une table orders où sont stockées les infos de commandes :
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}]');
On extrait les noms de tous les produits des commandes :
SELECT customer_name, jsonb_array_elements(items)->>'product' AS product FROM orders;
Résultat :
| customer_name | product |
|---|---|
| John | Laptop |
| John | Mouse |
| Alice | Phone |
Ensuite, on va creuser encore plus dans le JSONB, explorer les données imbriquées et voir comment les transformer pour les analyser plus facilement. Prépare-toi à encore plus de découvertes cool !
GO TO FULL VERSION