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