MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come restituire elementi da un array JSON in MariaDB

MariaDB include due selettori che ci consentono di selezionare elementi dagli array JSON:

  • [N] seleziona l'elemento numero N nell'array (ad esempio, [0] per selezionare il primo elemento).
  • [*] seleziona tutti gli elementi nell'array.

Questi possono essere utilizzati in numerose funzioni JSON incluse in MariaDB. I seguenti esempi li usano con JSON_EXTRACT() funzione per restituire gli elementi dell'array selezionati.

Esempio – [N]

Ecco un semplice esempio per dimostrare come selezionare un singolo elemento dell'array:

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

Risultato:

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

Gli array sono a base zero, quindi $[1] seleziona il secondo elemento dell'array.

Ecco un altro esempio, questa volta utilizzando un documento JSON leggermente più grande:

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

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

Risultato:

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

In questo caso, .sizes specifica le sizes membro dell'oggetto, e così $.sizes[1] seleziona il secondo articolo nelle sizes matrice.

Esempio- [*]

Il [*] il selettore seleziona tutti gli elementi nell'array.

Esempio:

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

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

Risultato:

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

In questo caso, il risultato ha lo stesso aspetto dell'array originale, nel qual caso potrebbe essere stato restituito semplicemente specificando $.sizes .

Selettori di array multipli

Ma ecco un altro esempio che utilizza due selettori di array.

Innanzitutto, utilizziamo un selettore di caratteri jolly per selezionare tutti gli elementi nell'array. Quindi utilizziamo un altro selettore di array per selezionare solo il secondo elemento in un array che è nidificato all'interno di quegli elementi:

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

Risultato:

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

Passaggio con caratteri jolly

Se il tuo documento JSON contiene più array con lo stesso nome, alcuni nidificati a livelli diversi o nel proprio oggetto, puoi selezionarli tutti con l'aiuto del passaggio con caratteri jolly (** ). Il passaggio con caratteri jolly seleziona ricorsivamente tutti gli elementi figlio dell'elemento corrente.

Qui, lo usiamo per aiutare a costruire un'espressione JSONPath che restituisce il secondo elemento dell'array da tutti gli array chiamati sizes , inclusi gli array nidificati all'interno di altri documenti:

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

Risultato:

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