По сути, вы хотите применить выделение и проекцию к элементам массива и полям объекта вашего документа 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, или создаете VIEW для этого.
Вы сказали, что не знаете полей атрибутов, но чтобы написать запрос JSON_TABLE (), вы должны указать атрибуты, которые вы хотите найти и спроецировать в своем запросе. Вы не можете использовать это для полностью неопределенных данных.
Я ответил на множество похожих вопросов об использовании JSON в MySQL. Я заметил, что когда вы хотите сделать что-то подобное, обрабатывая документ JSON как таблицу, чтобы вы могли применить условие в предложении WHERE к полям в ваших данных JSON, тогда все ваши запросы становятся намного сложнее. Затем вы начинаете чувствовать, что вам лучше потратить несколько минут на определение ваших атрибутов, чтобы вы могли писать более простые запросы.