В MariaDB, JSON_VALUE()
функция и JSON_QUERY()
функция прави подобни неща – връща данни от JSON документ.
И така, каква е разликата?
Основната разлика е, че JSON_VALUE()
връща скаларни стойности, докато JSON_QUERY()
връща масиви и обекти.
Дефиниции
Като се има предвид JSON документ, всяка функция прави следното:
JSON_VALUE()
връща скалара, определен от пътя.JSON_QUERY()
връща обект или масив, посочен от пътя.
Моето разбиране е, че работи по този начин поради SQL стандарта.
Ако това създава проблеми за вас, може да намерите JSON_EXTRACT()
функция по-полезна.
Скаляри
Ето пример, за да демонстрираме какво се случва, когато се опитаме да използваме и двете функции, за да извлечем скалар от 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;
Резултат:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
върна скалара според очакванията, но JSON_QUERY()
върна NULL
. Това се очаква, защото JSON_QUERY()
връща само масиви и обекти.
Същият резултат е, ако се опитаме да върнем скаларни данни от масива:
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;
Резултат:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Обекти
Ето какво се случва, когато се опитаме да използваме и двете функции, за да върнем цял обект:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Резултат:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Този път това е JSON_QUERY()
функция, която е успешна.
Масиви
Ето какво се случва, когато се опитаме да използваме и двете функции, за да върнем цял масив:
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_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Отново JSON_QUERY()
функцията е успешна.
Нито една от функциите обаче не е успешна, когато използваме оператора за заместващ знак на масива, за да изберем всички скаларни елементи от масива. В този случай JSON_EXTRACT()
идва на помощ:
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;
Резултат:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Ако обаче елементите на масива са масиви или обекти, тогава JSON_QUERY()
връща ги добре:
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;
Резултат:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+