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

Как работи JSONPath Wildcard Step (**) в MariaDB

Когато работите с JSON в MariaDB, можете да използвате JSONPath изрази, за да манипулирате данни в JSON документ.

Една мощна функция, която MariaDB предоставя, е стъпката за заместващ знак (** ). Това ви позволява да избирате рекурсивно всички дъщерни елементи на текущия елемент.

Стъпката със заместващи знаци е нестандартно разширение и също се поддържа със същото значение в MySQL.

Пример

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

SET @json = '[
    { "name" : "Wag", "type" : "Dog" },
    { "name" : "Bark", "type" : "Dog" },
    { "name" : "Meow", "type" : "Cat" },
    { "name" : "Scratch", "type" : "Cat" }
]';

SELECT JSON_EXTRACT(@json, '$**.name');

Резултат:

+------------------------------------+
| JSON_EXTRACT(@json, '$**.name')    |
+------------------------------------+
| ["Wag", "Bark", "Meow", "Scratch"] |
+------------------------------------+

Стъпката със заместващ знак премина през всички обекти и избра стойностите от тяхното name членове.

В този случай можехме да постигнем същия резултат с друг селектор. Селекторът за заместващи символи на масива би ни помогнал да получим същия резултат:

SET @json = '[
    { "name" : "Wag", "type" : "Dog" },
    { "name" : "Bark", "type" : "Dog" },
    { "name" : "Meow", "type" : "Cat" },
    { "name" : "Scratch", "type" : "Cat" }
]';

SELECT JSON_EXTRACT(@json, '$[*].name');

Резултат:

+------------------------------------+
| JSON_EXTRACT(@json, '$[*].name')   |
+------------------------------------+
| ["Wag", "Bark", "Meow", "Scratch"] |
+------------------------------------+

Същият резултат.

Нещата обаче се променят, ако използваме различен документ.

Пример 2

В следващия пример получаваме различен резултат между стъпката на заместващия знак и селектора на масив:

SET @json = '[
    { 
        "name" : "Homer", 
        "pets" : [
            { 
            "name" : "Wag",
            "type" : "Dog"
            },
            { 
            "name" : "Scratch",
            "type" : "Cat"
            }
        ]    
    }
]';

SELECT 
    JSON_EXTRACT(@json, '$**.name'),
    JSON_EXTRACT(@json, '$[*].name');

Резултат:

+---------------------------------+----------------------------------+
| JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') |
+---------------------------------+----------------------------------+
| ["Homer", "Wag", "Scratch"]     | ["Homer"]                        |
+---------------------------------+----------------------------------+

Различен резултат.

Резултатите очевидно ще зависят от документа и действителната конструкция на израза JSONPath, а използваните селектори ще зависят от вашите изисквания.

Едно нещо, което трябва да запомните, е, че стъпката с заместващ знак не трябва да е последната стъпка в израза JSONPath. Тя трябва да бъде последвана от стъпка за избор на член на масив или обект.

Пример 3

Ето пример, който връща втория елемент на масива от всички масиви, наречен sizes , включително масиви, които са вложени в други документи:

SET @json = '[
    { 
        "_id": 1, 
        "product": { 
            "name" : "Tuxedo", 
            "color" : "Blue",
            "sizes": [ "S", "M", "L" ],
            "accessories" : {
                "belt" : {
                    "color" : "Navy",
                    "sizes" : [ "Wide", "Narrow" ]
                },
                "tie" : {
                    "color" : "Black",
                    "sizes" : [ "Short", "Medium", "Long" ]
                }
            }
        }
    }
]';

SELECT JSON_EXTRACT(@json, '$**.sizes[1]');

Резултат:

+-------------------------------------+
| JSON_EXTRACT(@json, '$**.sizes[1]') |
+-------------------------------------+
| ["M", "Narrow", "Medium"]           |
+-------------------------------------+

Масивите са базирани на нула и така $**.sizes[1] се отнася до втория елемент във всички sizes масиви.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как работи PERIOD_DIFF() в MariaDB

  2. MySQL срещу MariaDB срещу Percona Server:Сравнение на функциите за сигурност

  3. Как да конфигурирате AppArmor за системи, базирани на MySQL (MySQL/MariaDB репликация + Galera)

  4. Възстановяване на екземпляр на mySQL от друг потребителски акаунт (macOS)

  5. Как да настроите наречени часови зони в MariaDB