MariaDB
 sql >> база данни >  >> RDS >> MariaDB

MariaDB JSON_VALUE() срещу JSON_QUERY():Каква е разликата?

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ръководство за поточно репликация на клъстер на MySQL Galera:част втора

  2. Балансиране на натоварването на базата данни с ProxySQL &AWS Aurora

  3. Инсталиране на MariaDB 10.1 в Debian Jessie и изпълнение на различни заявки за MariaDB

  4. Как BIN() работи в MariaDB

  5. Поправете „ГРЕШКА 1222 (21000):Използваните оператори SELECT имат различен брой колони“, когато използвате UNION в MariaDB