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

MariaDB JSON_EXTRACT() Обяснено

В MariaDB, JSON_EXTRACT() е вградена функция, която извлича данни от JSON документ въз основа на даден път или пътеки.

Може да връща единични стойности и множество стойности. Ако съвпадне една стойност, се връща една стойност. Ако съвпаднат няколко стойности, тогава тези стойности се връщат в масив.

Синтаксис

Синтаксисът е така:

JSON_EXTRACT(json_doc, path[, path] ...)

Където json_doc е JSON документът и всеки path аргументът е път в документа.

Пример

Ето пример за демонстрация.

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name');

Резултат:

+----------------------------------------+
| JSON_EXTRACT(@json_document, '$.name') |
+----------------------------------------+
| "Wag"                                  |
+----------------------------------------+

Множество пътища

Ето пример за посочване на множество пътища, за да се върнат множество стойности от JSON документа.

Когато върнете няколко стойности, те се връщат в масив.

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');

Резултат:

+----------------------------------------------------+
| JSON_EXTRACT(@json_document, '$.name', '$.weight') |
+----------------------------------------------------+
| ["Wag", 20]                                        |
+----------------------------------------------------+

Несъществуващи пътища

Предаването на път, който не съществува в JSON документа, води до NULL .

Пример:

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.color');

Резултат:

+-----------------------------------------+
| JSON_EXTRACT(@json_document, '$.color') |
+-----------------------------------------+
| NULL                                    |
+-----------------------------------------+

Ако обаче са предадени множество пътища и поне един от тях съвпада, тогава съответстващата стойност се извлича и връща в масив. Това е вярно дори ако е извлечена само една стойност.

Пример:

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');

Резултат:

+---------------------------------------------------+
| JSON_EXTRACT(@json_document, '$.name', '$.color') |
+---------------------------------------------------+
| ["Wag"]                                           |
+---------------------------------------------------+

Масиви

Ето пример за извличане на данни от масив:

SET @json_document = '
    { 
        "_id" : 1, 
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');

Резултат:

+---------------------------------------------+
| JSON_EXTRACT(@json_document, '$.awards[0]') |
+---------------------------------------------+
| "Top Dog"                                   |
+---------------------------------------------+

Масивите са базирани на нула и така $.awards[0] извлича първия елемент от 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.New York Marathon'
    ) AS Result;

Резултат:

+---------------+
| Result        |
+---------------+
| "Fastest Dog" |
+---------------+

Ако обаче искаме да извлечем всички награди, бихме могли да съкратим пътя до $.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;

Резултат:

+---------------------------------------------------------------------------------------------------+
| Result                                                                                            |
+---------------------------------------------------------------------------------------------------+
| {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} |
+---------------------------------------------------------------------------------------------------+

Украсете резултата

Можем да направим резултата по-лесен за четене, като предадем JSON_EXTRACT() към JSON_DETAILED() функция:

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;

Резултат:

+------------------------------------------------+
| Result                                         |
+------------------------------------------------+
| {
    "Florida Dog Awards": "Top Dog",
    "New York Marathon": "Fastest Dog",
    "Sumo 2020": "Biggest Dog"
} |
+------------------------------------------------+

Нулеви аргументи

Ако някой аргумент е NULL , резултатът е NULL :

SELECT 
    JSON_EXTRACT(null, '$.type'),
    JSON_EXTRACT('{"a":1}', null);

Резултат:

+------------------------------+-------------------------------+
| JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) |
+------------------------------+-------------------------------+
| NULL                         | NULL                          |
+------------------------------+-------------------------------+

Неправилен брой параметри

Предоставянето на без аргументи води до грешка:

SELECT JSON_EXTRACT();

Резултат:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'

Същото е, когато предоставите твърде малко или твърде много аргументи:

SELECT JSON_EXTRACT('{ "a": 1}');

Резултат:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'

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

  2. Извадете месец от дата в MariaDB

  3. Преглед за 2018 г.:7 етапа на MariaDB, които може да сте пропуснали

  4. MariaDB JSON_QUOTE() Обяснено

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