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