V podstatě máte v úmyslu použít výběr a projekci na prvky pole a pole objektů vašeho dokumentu JSON. Chcete-li vybrat "řádek" v poli, musíte udělat něco jako klauzuli WHERE a pak udělat něco jako vybrat jedno z polí (ne to, které jste použili ve svých kritériích výběru).
Ty se provádějí v SQL pomocí klauzule WHERE a seznamu sloupců SELECT, ale udělat totéž s JSON není něco, co lze snadno provést pomocí funkcí jako JSON_SEARCH() a JSON_CONTAINS().
Řešení, které MySQL 8.0 poskytuje, je JSON_TABLE() pomocí funkce převést dokument JSON na virtuální odvozenou tabulku – jako byste definovali konvenční řádky a sloupce. Funguje to, pokud je JSON ve formátu, který popisujete, pole objektů.
Zde je ukázka, kterou jsem provedl vložením vašich ukázkových dat do tabulky:
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 |
+--------+----------+
Nyní můžete dělat věci, které běžně děláte s SELECT dotazy, jako je výběr a projekce:
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 má několik problémů:
-
Musíte to udělat pokaždé dotazujete se na data JSON, nebo si k tomu vytvoříte VIEW.
-
Řekli jste, že neznáte pole atributů, ale chcete-li napsat dotaz JSON_TABLE(), musíte zadat atributy, které chcete v dotazu hledat a promítat. Toto nemůžete použít pro zcela nedefinovaná data.
Odpověděl jsem na řadu podobných otázek o používání JSON v MySQL. Všiml jsem si, že když chcete udělat něco podobného, zacházet s dokumentem JSON jako s tabulkou, abyste mohli použít podmínku v klauzuli WHERE na pole ve vašich datech JSON, pak budou všechny vaše dotazy mnohem obtížnější. Pak začnete mít pocit, že by bylo lepší strávit několik minut definováním atributů, abyste mohli psát jednodušší dotazy.