sql >> Databáze >  >> RDS >> MariaDB

Jak funguje krok zástupného znaku JSONPath (**) v MariaDB

Při práci s JSON v MariaDB můžete použít výrazy JSONPath k manipulaci s daty v dokumentu JSON.

Jednou z výkonných funkcí, kterou MariaDB poskytuje, je krok se zástupným znakem (** ). To vám umožňuje rekurzivně vybrat všechny podřízené prvky aktuálního prvku.

Zástupný znak je nestandardní rozšíření a je také podporováno se stejným významem v MySQL.

Příklad

Zde je příklad k demonstraci:

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

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

Výsledek:

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

Krok zástupných znaků prošel všechny objekty a vybral hodnoty z jejich name členů.

V tomto případě jsme stejného výsledku mohli dosáhnout s jiným selektorem. Selektor zástupných znaků pole by nám pomohl získat stejný výsledek:

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

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

Výsledek:

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

Stejný výsledek.

Věci se však změní, pokud použijeme jiný dokument.

Příklad 2

V následujícím příkladu získáme jiný výsledek mezi krokem zástupného znaku a selektorem pole:

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

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

Výsledek:

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

Jiný výsledek.

Výsledky budou samozřejmě záviset na dokumentu a skutečné konstrukci výrazu JSONPath a použité selektory budou záviset na vašich požadavcích.

Jedna věc, kterou je třeba si zapamatovat, je, že krok zástupného znaku nesmí být posledním krokem ve výrazu JSONPath. Musí následovat krok selektoru prvku pole nebo objektu.

Příklad 3

Zde je příklad, který vrací druhý prvek pole ze všech polí s názvem sizes , včetně polí, která jsou vnořena do jiných dokumentů:

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]');

Výsledek:

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

Pole jsou založeny na nule, takže $**.sizes[1] odkazuje na druhý prvek ve všech sizes pole.


  1. Jak odstranit uživatele databáze MySQL v cPanel

  2. Jak vytvořit databázi Accessu v cloudu

  3. Jak zrušit kontingenční tabulku v MySQL

  4. Jak získat další hodnotu sekvence SQL Server v Entity Framework?