Zasadniczo chcesz zastosować wybór i projekcję do elementów tablicy i pól obiektów w dokumencie JSON. Musisz zrobić coś takiego jak klauzula WHERE, aby wybrać „wiersz” w tablicy, a następnie zrobić coś takiego, jak wybranie jednego z pól (nie tego, którego użyłeś w kryteriach wyboru).
Są one wykonywane w SQL przy użyciu klauzuli WHERE i listy kolumn SELECT, ale robienie tego samego z JSON nie jest czymś, co można łatwo zrobić z funkcjami takimi jak JSON_SEARCH() i JSON_CONTAINS().
Rozwiązaniem, które zapewnia MySQL 8.0 jest JSON_TABLE() funkcja przekształcająca dokument JSON w wirtualną tabelę pochodną — tak, jakbyś zdefiniował konwencjonalne wiersze i kolumny. Działa, jeśli JSON ma format, który opisujesz, tablicę obiektów.
Oto demo, które zrobiłem, wstawiając przykładowe dane do tabeli:
create table mytable ( mycol json );
insert into mytable set mycol = '[{"Race": "Orc", "strength": 14}, {"Race": "Knight", "strength": 7}]';
SELECT j.* FROM mytable, JSON_TABLE(mycol,
'$[*]' COLUMNS (
race VARCHAR(10) PATH '$.Race',
strength INT PATH '$.strength'
)
) AS j;
+--------+----------+
| race | strength |
+--------+----------+
| Orc | 14 |
| Knight | 7 |
+--------+----------+
Teraz możesz robić rzeczy, które normalnie robisz z zapytaniami SELECT, takie jak selekcja i projekcja:
SELECT j.strength FROM mytable, JSON_TABLE(mycol, '$[*]'
COLUMNS (
race VARCHAR(10) PATH '$.Race',
strength INT PATH '$.strength'
)
) AS j
WHERE j.race = 'Orc'
+----------+
| strength |
+----------+
| 14 |
+----------+
To ma kilka problemów:
-
Musisz to robić za każdym razem wysyłasz zapytanie o dane JSON lub tworzysz WIDOK, aby to zrobić.
-
Powiedziałeś, że nie znasz pól atrybutów, ale aby napisać zapytanie JSON_TABLE(), musisz określić atrybuty, które chcesz przeszukiwać i projektować w zapytaniu. Nie możesz tego użyć do całkowicie niezdefiniowanych danych.
Odpowiedziałem na wiele podobnych pytań dotyczących używania JSON w MySQL. Zauważyłem, że jeśli chcesz zrobić coś takiego, traktując dokument JSON jak tabelę, aby móc zastosować warunek w klauzuli WHERE do pól w danych JSON, wszystkie twoje zapytania stają się znacznie trudniejsze. Wtedy zaczynasz czuć, że lepiej byłoby poświęcić kilka minut na zdefiniowanie swoich atrybutów, aby móc pisać prostsze zapytania.