W MariaDB, JSON_EXTRACT()
to wbudowana funkcja, która wyodrębnia dane z dokumentu JSON na podstawie podanej ścieżki lub ścieżek.
Może zwracać pojedyncze wartości i wiele wartości. W przypadku dopasowania pojedynczej wartości zwracana jest pojedyncza wartość. Jeśli dopasowanych jest wiele wartości, te wartości są zwracane w tablicy.
Składnia
Składnia wygląda tak:
JSON_EXTRACT(json_doc, path[, path] ...)
Gdzie json_doc
jest dokumentem JSON, a każda path
argument jest ścieżką w dokumencie.
Przykład
Oto przykład do zademonstrowania.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
Wynik:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
Wiele ścieżek
Oto przykład określania wielu ścieżek w celu zwrócenia wielu wartości z dokumentu JSON.
Gdy zwracasz wiele wartości, są one zwracane w postaci tablicy.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
Wynik:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
Nieistniejące ścieżki
Przekazanie ścieżki, która nie istnieje w dokumencie JSON, daje w wyniku NULL
.
Przykład:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
Wynik:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
Jeśli jednak przepuszczono wiele ścieżek i przynajmniej jedna z nich jest zgodna, pasująca wartość jest wyodrębniana i zwracana w postaci tablicy. Dzieje się tak, nawet jeśli wyodrębniona jest tylko jedna wartość.
Przykład:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
Wynik:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
Tablice
Oto przykład wyodrębniania danych z tablicy:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
Wynik:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
Tablice są liczone od zera, więc $.awards[0]
wyodrębnia pierwszy element awards
tablica.
Obiekty zagnieżdżone
Oto przykład wyodrębniania danych z obiektu zagnieżdżonego w innym obiekcie:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards.New York Marathon'
) AS Result;
Wynik:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
Jeśli jednak chcielibyśmy wyodrębnić wszystkie nagrody, moglibyśmy skrócić ścieżkę do $.details.awards
:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards'
) AS Result;
Wynik:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
Precyzuj wynik
Możemy ułatwić odczytanie wyniku, przekazując JSON_EXTRACT()
do JSON_DETAILED()
funkcja:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_EXTRACT(
@json_document,
'$.details.awards'
)
) AS Result;
Wynik:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
Argumenty zerowe
Jeśli jakikolwiek argument ma wartość NULL
, wynik to NULL
:
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
Wynik:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
Nieprawidłowa liczba parametrów
Brak argumentów skutkuje błędem:
SELECT JSON_EXTRACT();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
Tak samo jest, gdy podasz za mało lub za dużo argumentów:
SELECT JSON_EXTRACT('{ "a": 1}');
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'