sql >> Base de Datos >  >> RDS >> SQLite

3 formas de extraer un valor de un documento JSON en SQLite

Cuando usamos SQLite, podemos usar los siguientes métodos para extraer datos de un documento JSON.

El json_extract() Función

Como sugiere su nombre, el json_extract() La función extrae y devuelve uno o más valores de JSON bien formado.

Ejemplo:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Resultado:

{"name":"Bark","scores":[3,4,8,7]}

Las matrices se basan en cero, por lo que el recuento comienza en 0 . Por lo tanto, especificamos [1] para obtener el segundo elemento dentro de los dogs matriz, que resulta ser un objeto JSON.

Podemos devolver solo el nombre del perro en esa posición en la matriz agregando a nuestra ruta:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Resultado:

Bark

Podemos usar json_extract() para devolver varias rutas:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);

Resultado:

["Wag","Bark","Woof"]

Cuando extraemos valores de varias rutas, los valores se devuelven en una matriz.

El -> Operador

El -> El operador extrae un subcomponente de un documento JSON y devuelve una representación JSON de ese subcomponente.

Por lo tanto, podemos cambiar el primer ejemplo a este:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1]';

Resultado:

{"name":"Bark","scores":[3,4,8,7]}

El -> El operador es sutilmente diferente al json_extract() función:

  • El -> El operador siempre devuelve una representación JSON del subcomponente.
  • El json_extract() La función solo devuelve JSON si hay dos o más argumentos de ruta (porque el resultado es una matriz JSON) o si el argumento de ruta única hace referencia a una matriz u objeto.
  • Si solo hay un argumento de ruta y esa ruta hace referencia a un JSON nulo, una cadena o un valor numérico, entonces json_extract() devuelve el valor SQL NULL, TEXT, INTEGER o REAL correspondiente.

Por lo tanto, esto es lo que sucede cuando extraemos el nombre de un perro de nuestro JSON:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1].name';

Resultado:

"Bark"

Esta vez está rodeado de comillas. Eso es porque devolvió una representación JSON del valor. Cuando extrajimos el mismo valor con json_extract() anteriormente, obtuvimos una representación SQL del valor.

Sin embargo, también podemos usar el ->> operador para devolver una representación SQL.

El ->> Operador

El ->> El operador funciona de la misma manera que el -> operador, excepto que ->> devuelve una representación SQL del subcomponente especificado. Específicamente, devuelve un SQL TEXT , INTEGER , REAL o NULL valor que representa el subcomponente seleccionado, o NULL si el subcomponente no existe.

Por lo tanto, esto es lo que sucede cuando usamos ->> operador para extraer el nombre del perro:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' ->> '$.dogs[1].name';

Resultado:

Bark

Ya no está entre comillas.