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"] | +-------------------------------------+