По същество имате предвид да приложите селекция и проекция към елементите на масива и обектните полета на вашия JSON документ. Трябва да направите нещо като клауза WHERE, за да изберете "ред" в масива, и след това да направите нещо като да изберете едно от полетата (не това, което сте използвали във вашите критерии за избор).
Те се правят в SQL с помощта на клаузата WHERE и SELECT-списъка с колони, но да направите същото с JSON не е нещо, което можете да направите лесно с функции като JSON_SEARCH() и JSON_CONTAINS().
Решението, което MySQL 8.0 предоставя, е JSON_TABLE() функция за превръщане на JSON документ във виртуална извлечена таблица – все едно сте дефинирали конвенционални редове и колони. Работи, ако JSON е във формата, който описвате, масив от обекти.
Ето демонстрация, която направих, като вмъкнах вашите примерни данни в таблица:
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 |
+--------+----------+
Сега можете да правите неща, които обикновено правите със заявки SELECT, като избор и проекция:
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 |
+----------+
Това има няколко проблема:
-
Трябва да правите това всеки път заявявате JSON данните или създавате ИЗГЛЕД, за да го направите.
-
Казахте, че не знаете полетата за атрибути, но за да напишете JSON_TABLE() заявка, трябва да посочите атрибутите, които искате да търсите и проектирате във вашата заявка. Не можете да използвате това за напълно недефинирани данни.
Отговорих на доста подобни въпроси относно използването на JSON в MySQL. Забелязах, че когато искате да направите нещо подобно, третирайки JSON документ като таблица, за да можете да приложите условие в клаузата WHERE към полета във вашите JSON данни, тогава всичките ви заявки стават много по-трудни. Тогава започвате да се чувствате така, сякаш би било по-добре да отделите няколко минути, за да дефинирате атрибутите си, за да можете да пишете по-прости заявки.