V MariaDB, JSON_VALUE()
funkce a JSON_QUERY()
funkce dělají podobné věci – vracejí data z dokumentu JSON.
Jaký je tedy rozdíl?
Hlavní rozdíl je v tom, že JSON_VALUE()
vrátí skalární hodnoty, zatímco JSON_QUERY()
vrací pole a objekty.
Definice
Vzhledem k dokumentu JSON každá funkce dělá následující:
JSON_VALUE()
vrátí skalár určený cestou.JSON_QUERY()
vrátí objekt nebo pole určené cestou.
Chápu to tak, že to takto funguje díky standardu SQL.
Pokud vám to způsobuje problémy, můžete najít JSON_EXTRACT()
funkce užitečnější.
Skaláry
Zde je příklad demonstrující, co se stane, když se pokusíme použít obě funkce k extrahování skaláru z dokumentu 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;
Výsledek:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
vrátil skalár podle očekávání, ale JSON_QUERY()
vrátil NULL
. To se očekává, protože JSON_QUERY()
vrací pouze pole a objekty.
Je to stejný výsledek, pokud se pokusíme vrátit skalární data z pole:
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;
Výsledek:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objekty
Zde je to, co se stane, když se pokusíme použít obě funkce k vrácení celého objektu:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Výsledek:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Tentokrát je to JSON_QUERY()
funkce, která uspěje.
Pole
Zde je to, co se stane, když se pokusíme použít obě funkce k vrácení celého pole:
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;
Výsledek:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Opět JSON_QUERY()
funkce úspěšná.
Žádná funkce však neuspěje, když použijeme zástupný operátor pole k výběru všech skalárních prvků z pole. V tomto případě JSON_EXTRACT()
přichází na pomoc:
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;
Výsledek:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Pokud jsou však prvky pole pole nebo objekty, pak JSON_QUERY()
vrátí je v pořádku:
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;
Výsledek:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+