MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

MariaDB JSON_VALUE() vs JSON_QUERY():Qual é a diferença?


No MariaDB, o JSON_VALUE() função e JSON_QUERY() função fazem coisas semelhantes - eles retornam dados de um documento JSON.

Então qual é a diferença?

A principal diferença é que JSON_VALUE() retorna valores escalares, enquanto JSON_QUERY() retorna arrays e objetos.

Definições


Dado um documento JSON, cada função faz o seguinte:
  • JSON_VALUE() retorna o escalar especificado pelo caminho.
  • JSON_QUERY() retorna um objeto ou array especificado pelo caminho.

Meu entendimento é que funciona assim devido ao padrão SQL.

Se isso causar problemas para você, você pode encontrar o JSON_EXTRACT() função mais útil.

Escalares


Aqui está um exemplo para demonstrar o que acontece quando tentamos usar ambas as funções para extrair um escalar de um 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() retornou o escalar como esperado, mas JSON_QUERY() retornou NULL . Isso é esperado porque JSON_QUERY() retorna apenas arrays e objetos.

É o mesmo resultado se tentarmos retornar dados escalares do 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;

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

Objetos


Aqui está o que acontece quando tentamos usar ambas as funções para retornar um objeto inteiro:
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" } |
+------------+----------------------+

Desta vez é o JSON_QUERY() função que dá certo.

Matrizes


Aqui está o que acontece quando tentamos usar ambas as funções para retornar um array inteiro:
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" ] |
+------------+------------------------------------------+

Novamente, o JSON_QUERY() função for bem-sucedida.

No entanto, nenhuma função é bem-sucedida quando usamos o operador curinga de matriz para selecionar todos os elementos escalares da matriz. Nesse caso, o JSON_EXTRACT() vem em socorro:
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"] |
+------------+------------+----------------------------------------+

No entanto, se os elementos do array são arrays ou objetos, então JSON_QUERY() retorna-os bem:
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 } ] |
+------------+------------------------------------+