En MariaDB, el JSON_VALUE()
función y JSON_QUERY()
La función hace cosas similares:devuelven datos de un documento JSON.
Entonces, ¿cuál es la diferencia?
La principal diferencia es que JSON_VALUE()
devuelve valores escalares, mientras que JSON_QUERY()
devuelve matrices y objetos.
Definiciones
Dado un documento JSON, cada función hace lo siguiente:
JSON_VALUE()
devuelve el escalar especificado por la ruta.JSON_QUERY()
devuelve un objeto o matriz especificado por la ruta.
Tengo entendido que funciona de esta manera debido al estándar SQL.
Si esto le causa problemas, puede encontrar el JSON_EXTRACT()
función más útil.
Escaleras
Aquí hay un ejemplo para demostrar lo que sucede cuando intentamos usar ambas funciones para extraer un escalar de un documento JSON.
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;
Resultado:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
devolvió el escalar como se esperaba, pero JSON_QUERY()
devolvió NULL
. Esto es de esperar, porque JSON_QUERY()
solo devuelve arreglos y objetos.
Es el mismo resultado si tratamos de devolver datos escalares de la matriz:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;
Resultado:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objetos
Esto es lo que sucede cuando intentamos usar ambas funciones para devolver un objeto completo:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Resultado:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Esta vez es el JSON_QUERY()
función que tiene éxito.
Arreglos
Esto es lo que sucede cuando intentamos usar ambas funciones para devolver una matriz completa:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;
Resultado:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
De nuevo, JSON_QUERY()
la función tiene éxito.
Sin embargo, ninguna función tiene éxito cuando usamos el operador comodín de matriz para seleccionar todos los elementos escalares de la matriz. En este caso, el JSON_EXTRACT()
viene al rescate:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;
Resultado:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Sin embargo, si los elementos de la matriz son matrices u objetos, JSON_QUERY()
los devuelve bien:
SET @json_document = '
{
"name" : "Rufus",
"scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ]
}
';
SELECT
JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;
Resultado:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+