JSON_TABLE() în MySQL

Transformă date JSON într-un tabel virtual, cu rânduri și coloane, pe care îl poți interoga normal.

Sintaxă
JSON_TABLE(document, cale COLUMNS (coloana tip PATH 'cale', ...)) AS alias

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.