W MariaDB JSON_VALUE()
funkcja i JSON_QUERY()
funkcja robi podobne rzeczy – zwraca dane z dokumentu JSON.
Więc jaka jest różnica?
Główna różnica polega na tym, że JSON_VALUE()
zwraca wartości skalarne, natomiast JSON_QUERY()
zwraca tablice i obiekty.
Definicje
Biorąc pod uwagę dokument JSON, każda funkcja wykonuje następujące czynności:
JSON_VALUE()
zwraca skalar określony przez ścieżkę.JSON_QUERY()
zwraca obiekt lub tablicę określoną przez ścieżkę.
Rozumiem, że działa to w ten sposób ze względu na standard SQL.
Jeśli powoduje to problemy, możesz znaleźć JSON_EXTRACT()
funkcja bardziej użyteczna.
Skalary
Oto przykład pokazujący, co się dzieje, gdy próbujemy użyć obu funkcji do wyodrębnienia wartości skalarnej 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;
Wynik:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
zwrócił skalar zgodnie z oczekiwaniami, ale JSON_QUERY()
zwrócono NULL
. Jest to oczekiwane, ponieważ JSON_QUERY()
zwraca tylko tablice i obiekty.
To ten sam wynik, jeśli spróbujemy zwrócić dane skalarne z tablicy:
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;
Wynik:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Obiekty
Oto, co się dzieje, gdy próbujemy użyć obu funkcji do zwrócenia całego obiektu:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Wynik:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Tym razem jest to JSON_QUERY()
funkcja, która się powiedzie.
Tablice
Oto, co się dzieje, gdy próbujemy użyć obu funkcji do zwrócenia całej tablicy:
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;
Wynik:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Ponownie, JSON_QUERY()
funkcja się powiedzie.
Jednak żadna funkcja nie powiedzie się, gdy użyjemy operatora wieloznacznego tablicy do wybrania wszystkich elementów skalarnych z tablicy. W tym przypadku JSON_EXTRACT()
przychodzi na ratunek:
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;
Wynik:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Jeśli jednak elementy tablicy są tablicami lub obiektami, wtedy JSON_QUERY()
zwraca je dobrze:
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;
Wynik:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+