Ce face JSON_TABLE()
JSON_TABLE() este puntea dintre JSON și SQL: fiecare element găsit la cale devine un rând, iar COLUMNS definește coloanele. FOR ORDINALITY numerotează rândurile.
Se folosește în FROM, de obicei alături de tabelul care conține JSON-ul.
Parametri
| Parametru | Descriere |
|---|---|
document |
Documentul (sau coloana JSON). |
cale |
Calea către elementele care devin rânduri, ex. '$.hobby[*]'. |
COLUMNS |
Definirea coloanelor rezultatului. |
Ce returnează
Un tabel virtual.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
CREATE TABLE profiluri (
id INT PRIMARY KEY,
date JSON
);
INSERT INTO profiluri VALUES
(1, '{"nume": "Ana", "oras": "Iași", "varsta": 31, "hobby": ["citit", "înot"], "adresa": {"strada": "Lăpușneanu", "nr": 12}}'),
(2, '{"nume": "Dan", "oras": "Cluj", "varsta": 45, "hobby": ["ciclism"]}'),
(3, '{"nume": "Ioana", "oras": "Iași", "varsta": 27, "hobby": []}');
Exemplul 1: Fiecare hobby pe un rând
SELECT p.date->>'$.nume' AS nume, h.nr, h.hobby
FROM profiluri AS p,
JSON_TABLE(p.date, '$.hobby[*]' COLUMNS (
nr FOR ORDINALITY,
hobby VARCHAR(20) PATH '$'
)) AS h
ORDER BY nume, h.nr;
Rezultat
+------+------+---------+
| nume | nr | hobby |
+------+------+---------+
| Ana | 1 | citit |
| Ana | 2 | înot |
| Dan | 1 | ciclism |
+------+------+---------+
Exemplul 2: O listă de produse primită ca JSON
SELECT *
FROM JSON_TABLE(
'[{"cod": "A1", "pret": 19.9}, {"cod": "B2", "pret": 5}]',
'$[*]' COLUMNS (cod VARCHAR(5) PATH '$.cod', pret DECIMAL(6,2) PATH '$.pret')
) AS produse;
Rezultat
+------+-------+
| cod | pret |
+------+-------+
| A1 | 19.90 |
| B2 | 5.00 |
+------+-------+
Greșeli frecvente
- Uiți aliasul de după
JSON_TABLE(...). Este obligatoriu, ca la orice tabel derivat.
Comenzi înrudite
JSON_EXTRACT(): Citește o valoare dintr-un document JSON după o cale ca ‘$.adresa.strada’.JSON_ARRAYAGG(): Funcție de agregare: strânge valorile unui grup într-o listă JSON.INNER JOIN: Combină rândurile din două tabele care au o valoare comună, de exemplu comenzile cu clienții lor.