Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL pesquisa valor json por chave na matriz


Você quer essencialmente aplicar seleção e projeção aos elementos de matriz e campos de objeto do seu documento JSON. Você precisa fazer algo como uma cláusula WHERE para selecionar uma "linha" dentro da matriz e, em seguida, fazer algo como escolher um dos campos (não aquele que você usou em seus critérios de seleção).

Isso é feito em SQL usando a cláusula WHERE e a lista SELECT de colunas, mas fazer o mesmo com JSON não é algo que você possa fazer facilmente com funções como JSON_SEARCH() e JSON_CONTAINS().

A solução que o MySQL 8.0 fornece é o JSON_TABLE() para transformar um documento JSON em uma tabela derivada virtual — como se você tivesse definido linhas e colunas convencionais. Funciona se o JSON estiver no formato que você descreve, uma matriz de objetos.

Aqui está uma demonstração que fiz inserindo seus dados de exemplo em uma tabela:
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 |
+--------+----------+

Agora você pode fazer coisas que normalmente faz com consultas SELECT, como seleção e projeção:
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 |
+----------+

Isso tem alguns problemas:

  1. Você precisa fazer isso todas as vezes você consulta os dados JSON ou então cria uma VIEW para fazer isso.

  2. Você disse que não conhece os campos de atributo, mas para escrever uma consulta JSON_TABLE(), você deve especificar os atributos que deseja pesquisar e projetar em sua consulta. Você não pode usar isso para dados totalmente indefinidos.

Eu respondi várias perguntas semelhantes sobre o uso de JSON no MySQL. Eu observei que quando você quer fazer esse tipo de coisa, tratando um documento JSON como uma tabela para que você possa aplicar a condição na cláusula WHERE a campos dentro de seus dados JSON, todas as suas consultas ficam muito mais difíceis. Então você começa a sentir que teria sido melhor gastar alguns minutos para definir seus atributos para poder escrever consultas mais simples.