En SQLite, el ->>
El operador extrae un subcomponente de un documento JSON y devuelve una representación SQL de ese subcomponente.
El ->>
El operador se introdujo por primera vez en SQLite versión 3.38.0 (lanzado el 22 de febrero de 2022).
Sintaxis
La sintaxis es así:
json ->> path
donde json
es el documento JSON y path
es la ruta al subcomponente que queremos extraer de él.
Así que proporcionamos un documento JSON a la izquierda del operador y especificamos la ruta que queremos extraer a su derecha.
El ->>
El operador siempre devuelve una representación SQL del subcomponente especificado. Para devolver una representación JSON, use el ->
operador en su lugar.
Ejemplos
Aquí hay un ejemplo simple para demostrar cómo ->>
el operador trabaja:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';
Resultado:
{"name":"Wag","type":"Dog"}
En este caso, especifiqué una ruta de '$'
que devuelve el documento completo.
Especifiquemos otra ruta:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
Resultado:
Dog
También podemos omitir el signo de dólar y el punto, así:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';
Resultado:
Dog
Aquí está con un documento JSON más grande:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0]';
Resultado:
{"user":"Spike","age":30,"scores":[9,7,3]}
En SQLite, las matrices se basan en cero, por lo que se especifica [0]
devuelve el primer elemento de la matriz.
Si solo quisiéramos obtener las puntuaciones de ese usuario, podríamos hacer esto:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores';
Resultado:
[9,7,3]
Podemos profundizar aún más y extraer una puntuación específica:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores[1]';
Resultado:
7
Ruta inexistente
Si la ruta no existe en el JSON, se devuelve un valor nulo:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';
Resultado:
null
Tenga en cuenta que en SQLite, puede usar .nullvalue
para especificar una cadena de salida cada vez que se devuelve un valor nulo. En mi caso, había ejecutado previamente el siguiente comando:
.nullvalue null
Eso especifica que el texto null
debe generarse siempre que se devuelva un valor nulo. Es por eso que el ejemplo anterior genera el texto null
. Si no hubiera hecho esto, el resultado podría haber estado en blanco.
JSON no válido
Si el primer argumento no es JSON válido, se arroja un error:
SELECT '{ "name" }' ->> '$';
Resultado:
Runtime error: malformed JSON
Ruta no válida
Y si el segundo argumento no es una ruta válida, se arroja un error:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';
Resultado:
Runtime error: JSON path error near 'name'
En este caso, olvidé incluir el punto final (.
) entre el signo de dólar ($
) y name
.
Sin embargo, como se mencionó, es posible omitir el signo de dólar y el punto por completo:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';
Resultado:
Wag