I MariaDB, JSON_VALUE()
funktion och JSON_QUERY()
funktion gör liknande saker – de returnerar data från ett JSON-dokument.
Så vad är skillnaden?
Den största skillnaden är att JSON_VALUE()
returnerar skalära värden, medan JSON_QUERY()
returnerar arrayer och objekt.
Definitioner
Med ett JSON-dokument gör varje funktion följande:
JSON_VALUE()
returnerar den skalär som anges av sökvägen.JSON_QUERY()
returnerar ett objekt eller en matris som anges av sökvägen.
Min uppfattning är att det fungerar på detta sätt på grund av SQL-standarden.
Om detta orsakar problem för dig kanske du hittar JSON_EXTRACT()
funktion mer användbar.
Skalärer
Här är ett exempel för att visa vad som händer när vi försöker använda båda funktionerna för att extrahera en skalär från ett JSON-dokument.
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;
Resultat:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
returnerade skalären som förväntat, men JSON_QUERY()
returnerade NULL
. Detta förväntas eftersom JSON_QUERY()
returnerar endast arrayer och objekt.
Det är samma resultat om vi försöker returnera skalär data från arrayen:
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;
Resultat:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objekt
Här är vad som händer när vi försöker använda båda funktionerna för att returnera ett helt objekt:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Resultat:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Den här gången är det JSON_QUERY()
funktion som lyckas.
Arrayer
Här är vad som händer när vi försöker använda båda funktionerna för att returnera en hel 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;
Resultat:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Återigen, JSON_QUERY()
funktionen lyckas.
Ingen av funktionerna lyckas dock när vi använder array-jokerteckenoperatorn för att välja alla skalära element från arrayen. I det här fallet, JSON_EXTRACT()
kommer till undsättning:
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;
Resultat:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Men om arrayens element är arrayer eller objekt, då JSON_QUERY()
returnerar dem fint:
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;
Resultat:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+