MariaDB
 sql >> Database >  >> RDS >> MariaDB

MariaDB JSON_VALUE() vs JSON_QUERY():qual è la differenza?

In MariaDB, il JSON_VALUE() funzione e JSON_QUERY() funzione fanno cose simili:restituiscono dati da un documento JSON.

Allora qual è la differenza?

La differenza principale è che JSON_VALUE() restituisce valori scalari, mentre JSON_QUERY() restituisce array e oggetti.

Definizioni

Dato un documento JSON, ogni funzione esegue le seguenti operazioni:

  • JSON_VALUE() restituisce lo scalare specificato dal percorso.
  • JSON_QUERY() restituisce un oggetto o un array specificato dal percorso.

La mia comprensione è che funziona in questo modo a causa dello standard SQL.

Se questo ti causa problemi, potresti trovare il JSON_EXTRACT() funzione più utile.

Scalari

Ecco un esempio per dimostrare cosa succede quando si tenta di utilizzare entrambe le funzioni per estrarre uno scalare da 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;

Risultato:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Rufus      | NULL       |
+------------+------------+

JSON_VALUE() ha restituito lo scalare come previsto, ma JSON_QUERY() restituito NULL . Questo è previsto, perché JSON_QUERY() restituisce solo matrici e oggetti.

È lo stesso risultato se proviamo a restituire dati scalari dall'array:

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;

Risultato:

+------------+------------+
| JSON_VALUE | JSON_QUERY |
+------------+------------+
| Top Dog    | NULL       |
+------------+------------+

Oggetti

Ecco cosa succede quando tentiamo di utilizzare entrambe le funzioni per restituire un intero oggetto:

SET @json_document = '{ "name" : "Rufus" }';

SELECT 
    JSON_VALUE(@json_document, '$') AS JSON_VALUE,
    JSON_QUERY(@json_document, '$') AS JSON_QUERY;

Risultato:

+------------+----------------------+
| JSON_VALUE | JSON_QUERY           |
+------------+----------------------+
| NULL       | { "name" : "Rufus" } |
+------------+----------------------+

Questa volta è il JSON_QUERY() funzione che riesce.

Array

Ecco cosa succede quando tentiamo di utilizzare entrambe le funzioni per restituire un intero array:

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;

Risultato:

+------------+------------------------------------------+
| JSON_VALUE | JSON_QUERY                               |
+------------+------------------------------------------+
| NULL       | [ "Top Dog", "Best Dog", "Biggest Dog" ] |
+------------+------------------------------------------+

Di nuovo, il JSON_QUERY() la funzione riesce.

Tuttavia, nessuna delle due funzioni riesce quando utilizziamo l'operatore jolly dell'array per selezionare tutti gli elementi scalari dall'array. In questo caso, il JSON_EXTRACT() viene in soccorso:

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;

Risultato:

+------------+------------+----------------------------------------+
| JSON_VALUE | JSON_QUERY | JSON_EXTRACT                           |
+------------+------------+----------------------------------------+
| Top Dog    | NULL       | ["Top Dog", "Best Dog", "Biggest Dog"] |
+------------+------------+----------------------------------------+

Tuttavia, se gli elementi dell'array sono array o oggetti, allora JSON_QUERY() li restituisce benissimo:

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;

Risultato:

+------------+------------------------------------+
| JSON_VALUE | JSON_QUERY                         |
+------------+------------------------------------+
| NULL       | [ [1, 2, 3], [8, 9], { "a" : 1 } ] |
+------------+------------------------------------+