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

SQLite JSON_SET()

El json_set() de SQLite La función nos permite insertar o reemplazar un valor en un documento JSON.

Pasamos el JSON original como primer argumento cuando llamamos a la función, seguido de una ruta que especifica dónde insertar/reemplazar el nuevo valor, seguido del valor para insertar/reemplazar.

También podemos insertar/reemplazar varios pares clave/valor si es necesario.

Sintaxis

Funciona así:

json_set(json, path1, value1, path2, value2...)

donde json representa el JSON original y path1, value1, path2, value2... son pares ruta/valor que podemos usar para insertar nuevos valores en el documento JSON (o reemplazar, según sea el caso).

Ejemplo

Aquí hay un ejemplo básico para demostrarlo:

SELECT json_set('{ "a" : 1 }', '$.b', 2);

Resultado:

{"a":1,"b":2}

Aquí, inserté un nuevo par clave/valor ("b":2 ) en el documento JSON.

Podemos insertar múltiples pares clave/valor como este:

SELECT json_set('{ "a" : 1 }', '$.b', 2, '$.c', 3 );

Resultado:

{"a":1,"b":2,"c":3}

Simplemente agregué más argumentos clave/valor cuando llamé a json_set() .

Reemplazar valores

Si la clave ya existe, su valor se reemplaza con el nuevo valor:

SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3);

Resultado:

{"a":1,"b":3}

Esta es la principal diferencia entre json_set() y json_insert() . El json_insert() la función no insertará el valor si la clave ya existe.

Otra forma de reemplazar valores es usar json_replace() .

Insertar un Objeto

Aquí hay un ejemplo de cómo insertar un objeto JSON:

SELECT json_set('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );

Resultado:

{"a":1,"b":{"c":2}}

En este caso, utilicé json() función para devolver mi argumento como una cadena JSON. Esto es lo que sucede cuando no hago eso:

SELECT json_set('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );

Resultado:

{"a":1,"b":"{ \"c\" : 2 }"}

El documento JSON se inserta como un valor de texto en lugar de un objeto JSON y, por lo tanto, sus comillas dobles se escapan con barras invertidas.

Sin embargo, simplemente eliminar las comillas simples da como resultado un error:

SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );

Resultado:

Parse error: unrecognized token: "{"
  SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
                          error here ---^

Sin comillas simples o json() función, obtenemos un error tan pronto como encuentra la llave izquierda.

Otra forma de insertar un objeto JSON es usar json_object() función en lugar de json() función:

SELECT json_set('{ "a" : 1 }', '$.b', json_object('c', 2) );

Resultado:

{"a":1,"b":{"c":2}}

Insertar una matriz

Es algo similar al insertar arreglos:

SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));

Resultado:

{"a":1,"b":[2,3,4]}

Si eliminamos el json() función, obtenemos esto:

SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');

Resultado:

{"a":1,"b":"[ 2, 3, 4 ]"}

Y si eliminamos las comillas simples, obtenemos un error:

SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);

Resultado:

Parse error: no such column:  2, 3, 4 
  SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
                          error here ---^

Alternativamente, podemos usar json_array() función en lugar de json() . Esa función le permite crear una matriz basada en sus argumentos:

SELECT json_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );

Resultado:

{"a":1,"b":[2,3,4]}

Agregar valores al final de una matriz

Podemos usar json_set() para agregar valores al final de una matriz.

Para hacer esto, use un índice de matriz de [#] :

SELECT json_set('[ 1, 2, 3 ]', '$[#]', 4 );

Resultado:

[1,2,3,4]

El mismo principio se aplica a las matrices anidadas:

SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );

Resultado:

[1,["a","b","c"],3]

Reemplazar elementos de matriz

Podemos usar json_set() para reemplazar elementos en la matriz:

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

Resultado:

[1,4,3]

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

El json_replace() La función también se puede utilizar para reemplazar elementos existentes. Nuevamente, esto es diferente a json_insert() , que no reemplaza elementos existentes.

Rutas no válidas

Obtendremos un error si nuestra ruta no está bien formada:

SELECT json_set('{ "a" : 1 }', 'b', 2);

Resultado:

Runtime error: JSON path error near 'b'

En este caso, olvidé incluir $. al frente del camino.

Documentos JSON no válidos

También obtendremos un error de que JSON no está bien formado:

SELECT json_set('{ "a" : 1', '$.b', 2);

Resultado:

Runtime error: malformed JSON

Esta vez el error nos dice que nuestro JSON está mal formado.