Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL cerca il valore json per chiave nell'array

In pratica intendi applicare selezione e proiezione agli elementi dell'array e ai campi oggetto del tuo documento JSON. Devi fare qualcosa come una clausola WHERE per selezionare una "riga" all'interno dell'array, quindi fare qualcosa come scegliere uno dei campi (non quello che hai utilizzato nei criteri di selezione).

Questi vengono eseguiti in SQL utilizzando la clausola WHERE e l'elenco di colonne SELECT, ma fare lo stesso con JSON non è qualcosa che puoi fare facilmente con funzioni come JSON_SEARCH() e JSON_CONTAINS().

La soluzione fornita da MySQL 8.0 è JSON_TABLE() funzione per trasformare un documento JSON in una tabella derivata virtuale, come se avessi definito righe e colonne convenzionali. Funziona se il JSON è nel formato che descrivi, un array di oggetti.

Ecco una demo che ho fatto inserendo i tuoi dati di esempio in una tabella:

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 |
+--------+----------+

Ora puoi fare le cose che fai normalmente con le query SELECT, come la selezione e la proiezione:

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 |
+----------+

Questo ha un paio di problemi:

  1. Devi farlo ogni volta interroghi i dati JSON, oppure crei una VIEW per farlo.

  2. Hai detto che non conosci i campi degli attributi, ma per scrivere una query JSON_TABLE(), devi specificare gli attributi che vuoi cercare e proiettare nella tua query. Non puoi usarlo per dati totalmente indefiniti.

Ho risposto a un certo numero di domande simili sull'utilizzo di JSON in MySQL. Ho osservato che quando vuoi fare questo genere di cose, trattando un documento JSON come una tabella in modo da poter applicare la condizione nella clausola WHERE ai campi all'interno dei tuoi dati JSON, tutte le tue query diventano molto più difficili. Quindi inizi a pensare che sarebbe stato meglio spendere qualche minuto per definire i tuoi attributi in modo da poter scrivere query più semplici.