sql >> Base de Datos >  >> RDS >> MariaDB

Cómo devolver elementos de una matriz JSON en MariaDB

MariaDB incluye dos selectores que nos permiten seleccionar elementos de matrices JSON:

  • [N] selecciona el número de elemento N en la matriz (por ejemplo, [0] para seleccionar el primer elemento).
  • [*] selecciona todos los elementos de la matriz.

Estos se pueden usar en una serie de funciones JSON que se incluyen en MariaDB. Los siguientes ejemplos los usan con JSON_EXTRACT() función para devolver elementos de matriz seleccionados.

Ejemplo:[N]

Aquí hay un ejemplo simple para demostrar cómo seleccionar un solo elemento de matriz:

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

Resultado:

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

Las matrices están basadas en cero, por lo que $[1] selecciona el segundo elemento de la matriz.

Aquí hay otro ejemplo, esta vez usando un documento JSON un poco más grande:

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

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

Resultado:

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

En este caso, .sizes especifica los sizes miembro del objeto, y así $.sizes[1] selecciona el segundo elemento en los sizes matriz.

Ejemplo- [*]

El [*] selector selecciona todos los elementos de la matriz.

Ejemplo:

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

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

Resultado:

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

En este caso, el resultado se ve exactamente igual que la matriz original, en cuyo caso, podría haberse devuelto simplemente especificando $.sizes .

Selectores de matrices múltiples

Pero aquí hay otro ejemplo que usa dos selectores de matriz.

Primero, usamos un selector comodín para seleccionar todos los elementos de la matriz. Luego usamos otro selector de matriz para seleccionar solo el segundo elemento en una matriz que está anidada dentro de esos elementos:

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

Resultado:

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

Paso comodín

Si su documento JSON contiene varias matrices con el mismo nombre, algunas anidadas en diferentes niveles o en su propio objeto, puede seleccionarlas todas con la ayuda del paso comodín (** ). El paso comodín selecciona recursivamente todos los elementos secundarios del elemento actual.

Aquí, lo usamos para ayudar a construir una expresión JSONPath que devuelve el segundo elemento de matriz de todas las matrices denominadas sizes , incluidas las matrices anidadas en otros documentos:

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

Resultado:

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