Du mener i bund og grund at anvende selektion og projektion til array-elementerne og objektfelterne i dit JSON-dokument. Du skal gøre noget som en WHERE-sætning for at vælge en "række" i arrayet, og derefter gøre noget som at vælge et af felterne (ikke det, du brugte i dine udvælgelseskriterier).
Disse udføres i SQL ved hjælp af WHERE-sætningen og SELECT-listen over kolonner, men at gøre det samme med JSON er ikke noget, du nemt kan gøre med funktioner som JSON_SEARCH() og JSON_CONTAINS().
Løsningen MySQL 8.0 giver er JSON_TABLE() funktion til at omdanne et JSON-dokument til en virtuel afledt tabel – som om du havde defineret konventionelle rækker og kolonner. Det virker, hvis JSON er i det format, du beskriver, en række objekter.
Her er en demo, jeg lavede ved at indsætte dine eksempeldata i en tabel:
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 |
+--------+----------+
Nu kan du gøre ting, du normalt gør med SELECT-forespørgsler, som f.eks. valg og projektion:
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 |
+----------+
Dette har et par problemer:
-
Du skal gøre dette hver gang du forespørger på JSON-dataene eller opretter en VIEW for at gøre det.
-
Du sagde, at du ikke kender attributfelterne, men for at skrive en JSON_TABLE()-forespørgsel, skal du angive de attributter, du vil søge i og projektere i din forespørgsel. Du kan ikke bruge dette til fuldstændig udefinerede data.
Jeg har besvaret en del lignende spørgsmål om brug af JSON i MySQL. Jeg har observeret, at når du vil gøre denne slags ting, behandle et JSON-dokument som en tabel, så du kan anvende betingelse i WHERE-sætningen til felter i dine JSON-data, så bliver alle dine forespørgsler meget vanskeligere. Så begynder du at føle, at du ville have været bedre stillet til at bruge et par minutter på at definere dine egenskaber, så du kunne skrive enklere forespørgsler.