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

Operador

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