sql >> Base de Datos >  >> RDS >> Mysql

MySQL busca valor json por clave en matriz

Básicamente, quiere aplicar selección y proyección a los elementos de matriz y campos de objeto de su documento JSON. Debe hacer algo como una cláusula WHERE para seleccionar una "fila" dentro de la matriz y luego hacer algo como elegir uno de los campos (no el que usó en sus criterios de selección).

Estos se realizan en SQL usando la cláusula WHERE y la lista de columnas SELECT, pero hacer lo mismo con JSON no es algo que pueda hacer fácilmente con funciones como JSON_SEARCH() y JSON_CONTAINS().

La solución que ofrece MySQL 8.0 es JSON_TABLE() función para convertir un documento JSON en una tabla derivada virtual, como si hubiera definido filas y columnas convencionales. Funciona si el JSON está en el formato que describe, una matriz de objetos.

Aquí hay una demostración que hice insertando sus datos de ejemplo en una tabla:

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

Ahora puede hacer lo que normalmente hace con las consultas SELECT, como selección y proyección:

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

Esto tiene un par de problemas:

  1. Tienes que hacer esto siempre consulta los datos JSON, o bien crea una VISTA para hacerlo.

  2. Dijo que no conoce los campos de atributo, pero para escribir una consulta JSON_TABLE(), debe especificar los atributos que desea buscar y proyectar en su consulta. No puede usar esto para datos totalmente indefinidos.

He respondido bastantes preguntas similares sobre el uso de JSON en MySQL. He observado que cuando quiere hacer este tipo de cosas, tratar un documento JSON como una tabla para poder aplicar la condición en la cláusula WHERE a los campos dentro de sus datos JSON, entonces todas sus consultas se vuelven mucho más difíciles. Luego, comienza a sentir que hubiera sido mejor dedicar unos minutos a definir sus atributos para poder escribir consultas más simples.