MySQL
Extraer valores de tipo JSON
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 (+)