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

Jak vrátit prvky z pole JSON v MariaDB

MariaDB obsahuje dva selektory, které nám umožňují vybrat prvky z polí JSON:

  • [N] vybere číslo prvku N v poli (například [0] pro výběr prvního prvku).
  • [*] vybere všechny prvky v poli.

Ty lze použít v řadě funkcí JSON, které jsou součástí MariaDB. Následující příklady je používají s JSON_EXTRACT() funkce, aby se vrátily vybrané prvky pole.

Příklad – [N]

Zde je jednoduchý příklad, který demonstruje, jak vybrat jeden prvek pole:

SELECT JSON_EXTRACT('[1,2,3]', '$[1]');

Výsledek:

+---------------------------------+
| JSON_EXTRACT('[1,2,3]', '$[1]') |
+---------------------------------+
| 2                               |
+---------------------------------+

Pole jsou založeny na nule, a tak $[1] vybere druhý prvek pole.

Zde je další příklad, tentokrát s použitím trochu většího dokumentu JSON:

SET @json = '
    { 
        "_id": 1, 
        "product": "Left Handed Screwdriver", 
        "sizes": [ "S", "M", "L" ] 
    }
';

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

Výsledek:

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

V tomto případě .sizes určuje sizes člen objektu, a tak $.sizes[1] vybere druhou položku v sizes pole.

Příklad- [*]

[*] selektor vybere všechny prvky v poli.

Příklad:

SET @json = '
    { 
        "_id": 1, 
        "product": "Left Handed Screwdriver", 
        "sizes": [ "S", "M", "L" ] 
    }
';

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

Výsledek:

+-----------------------------------+
| JSON_EXTRACT(@json, '$.sizes[*]') |
+-----------------------------------+
| ["S", "M", "L"]                   |
+-----------------------------------+

V tomto případě výsledek vypadá úplně stejně jako původní pole, v takovém případě mohl být vrácen pouze zadáním $.sizes .

Vícenásobné selektory pole

Ale tady je další příklad, který používá dva selektory pole.

Nejprve použijeme selektor zástupných znaků k výběru všech prvků v poli. Potom použijeme další selektor pole k výběru pouze druhého prvku v poli, které je vnořeno do těchto prvků:

SET @json = '
{ 
    "products" : 
    [
        { 
            "_id": 1, 
            "product": "Left Handed Screwdriver", 
            "sizes": [ "S", "M", "L" ] 
        },
        { 
            "_id": 2, 
            "product": "Long Weight", 
            "sizes": [ 8, 7, 10 ] 
        },
        { 
            "_id": 3, 
            "product": "Bottomless Coffee Cup", 
            "sizes": [ "Tall", "Grande", "Venti" ] 
        }
    ]
}
';

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

Výsledek:

+-----------------------------------------------+
| JSON_EXTRACT(@json, '$.products[*].sizes[1]') |
+-----------------------------------------------+
| ["M", 7, "Grande"]                            |
+-----------------------------------------------+

Krok se zástupnými znaky

Pokud váš dokument JSON obsahuje více polí se stejným názvem, z nichž některá jsou vnořena na různých úrovních nebo ve vlastním objektu, můžete je všechna vybrat pomocí kroku se zástupnými znaky (** ). Krok zástupných znaků rekurzivně vybere všechny podřízené prvky aktuálního prvku.

Zde jej používáme k vytvoření výrazu JSONPath, 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"]           |
+-------------------------------------+

  1. Zjednodušení testování jednotky Hlavní uložená procedura, která také nazývá proceduru utility

  2. Postgres/JSON - aktualizujte všechny prvky pole

  3. Dynamický pivotní dotaz pomocí PostgreSQL 9.3

  4. Předejte Dictionary<string,int> do uložené procedury T-SQL