Buscar..


Introducción

MySQL 5.7.8+ admite el tipo JSON nativo. Si bien tiene diferentes formas de crear objetos json, también puede acceder y leer miembros de diferentes formas.

La función principal es JSON_EXTRACT , por lo que los operadores -> y ->> son más amigables.

Sintaxis

  • JSON_EXTRACT (json_doc, ruta [, ...])
  • JSON_EXTRACT (json_doc, ruta)
  • JSON_EXTRACT (json_doc, path1, path2)

Parámetros

Parámetro Descripción
json_doc documento JSON válido
camino ruta de miembros

Observaciones

Mencionado en MySQL 5.7 Reference Manual

  • Múltiples valores coincidentes por argumento (s) de ruta

Si es posible que esos argumentos puedan devolver múltiples valores, los valores coincidentes se envuelven automáticamente como una matriz, en el orden correspondiente a las rutas que los produjeron. De lo contrario, el valor de retorno es el único valor coincidente.

  • Resultado NULL cuando:
    • cualquier argumento es NULL
    • camino no emparejado

Devuelve NULL si algún argumento es NULL o si no hay rutas de acceso ubican un valor en el documento.

Leer el valor de la matriz JSON

Cree la variable @myjson como tipo JSON ( lea más ):

 SET @myjson = CAST('["A","B",{"id":1,"label":"C"}]' as JSON) ;

SELECT algunos miembros!

 SELECT
   JSON_EXTRACT( @myjson , '$[1]' ) ,
   JSON_EXTRACT( @myjson , '$[*].label') ,
   JSON_EXTRACT( @myjson , '$[1].*' ) ,
   JSON_EXTRACT( @myjson , '$[2].*')
 ;
 -- result values:
 '\"B\"', '[\"C\"]', NULL, '[1, \"C\"]'
 -- visually:
 "B", ["C"], NULL, [1, "C"]

Operadores de extracto JSON

Extraiga la path mediante -> o ->> Operadores, mientras que ->> es un valor NO ASUMIDO:

 SELECT
   myjson_col->>'$[1]' , myjson_col->'$[1]' ,
   myjson_col->>'$[*].label' ,
   myjson_col->>'$[1].*' ,
   myjson_col->>'$[2].*'
 FROM tablename ;
  -- visuall:
     B, "B" , ["C"], NULL, [1, "C"]
  --^^^ ^^^

Entonces col->>path es igual a JSON_UNQUOTE(JSON_EXTRACT(col,path)) :

Al igual que con ->, el operador - >> siempre se expande en la salida de EXPLAIN, como lo demuestra el siguiente ejemplo:

mysql> EXPLAIN SELECT c->>'$.name' AS name   
    ->     FROM jemp WHERE g > 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: jemp
   partitions: NULL
         type: range
possible_keys: i
          key: i
      key_len: 5
          ref: NULL
         rows: 2
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select
json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from
`jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2)
1 row in set (0.00 sec)

Lea sobre el extracto de ruta en línea (+)



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow