sql >> Base de Datos >  >> RDS >> MariaDB

MariaDB JSON_VALUE() vs JSON_QUERY():¿Cuál es la diferencia?

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