SQLite proporciona varias funciones para insertar, configurar y reemplazar valores en un documento JSON. Específicamente, proporciona json_insert()
, json_set()
y json_replace()
.
Estas funciones realizan tareas similares y, a veces, puede usarlas indistintamente hasta cierto punto.
Pero definitivamente hay una clara diferencia entre cada función.
La diferencia
La siguiente tabla describe la diferencia entre estas funciones:
Función | ¿Sobrescribir si ya existe? | ¿Crear si no existe? |
---|---|---|
json_insert() | No | Sí |
json_replace() | Sí | No |
json_set() | Sí | Sí |
Entonces, la diferencia entre estas funciones está en cómo tratan las claves/valores existentes e inexistentes.
Ejemplos
Aquí hay algunos ejemplos simples para demostrar cómo cada función trata con claves/valores existentes y no existentes.
Cuando la clave ya existe
Así es como cada función se ocupa de actualizar una clave que ya existe:
SELECT
json_insert('{ "a" : 1 }', '$.a', 2) AS json_insert,
json_replace('{ "a" : 1 }', '$.a', 2) AS json_replace,
json_set('{ "a" : 1 }', '$.a', 2) AS json_set;
Resultado:
+-------------+--------------+----------+ | json_insert | json_replace | json_set | +-------------+--------------+----------+ | {"a":1} | {"a":2} | {"a":2} | +-------------+--------------+----------+
Podemos ver que json_insert()
no actualizó nada, pero las otras dos funciones sí.
Es algo similar con las matrices:
SELECT
json_insert('[ 1, 2, 3 ]', '$[1]', 4) AS json_insert,
json_replace('[ 1, 2, 3 ]', '$[1]', 4) AS json_replace,
json_set('[ 1, 2, 3 ]', '$[1]', 4) AS json_set;
Resultado:
+-------------+--------------+----------+ | json_insert | json_replace | json_set | +-------------+--------------+----------+ | [1,2,3] | [1,4,3] | [1,4,3] | +-------------+--------------+----------+
Cuando la clave no existe
Esto es lo que sucede cuando la clave no existe:
SELECT
json_insert('{ "a" : 1 }', '$.b', 2) AS json_insert,
json_replace('{ "a" : 1 }', '$.b', 2) AS json_replace,
json_set('{ "a" : 1 }', '$.b', 2) AS json_set;
Resultado:
+---------------+--------------+---------------+ | json_insert | json_replace | json_set | +---------------+--------------+---------------+ | {"a":1,"b":2} | {"a":1} | {"a":1,"b":2} | +---------------+--------------+---------------+
Podemos ver que json_replace()
no insertó el nuevo par clave/valor, pero las otras dos funciones sí lo hicieron.
Mismo trato con matrices:
SELECT
json_insert('[ 1, 2, 3 ]', '$[3]', 4) AS json_insert,
json_replace('[ 1, 2, 3 ]', '$[3]', 4) AS json_replace,
json_set('[ 1, 2, 3 ]', '$[3]', 4) AS json_set;
Resultado:
+-------------+--------------+-----------+ | json_insert | json_replace | json_set | +-------------+--------------+-----------+ | [1,2,3,4] | [1,2,3] | [1,2,3,4] | +-------------+--------------+-----------+
Esto también se puede hacer usando el [#]
ruta:
SELECT
json_insert('[ 1, 2, 3 ]', '$[#]', 4) AS json_insert,
json_replace('[ 1, 2, 3 ]', '$[#]', 4) AS json_replace,
json_set('[ 1, 2, 3 ]', '$[#]', 4) AS json_set;
Resultado:
+-------------+--------------+-----------+ | json_insert | json_replace | json_set | +-------------+--------------+-----------+ | [1,2,3,4] | [1,2,3] | [1,2,3,4] | +-------------+--------------+-----------+
Un beneficio de usar [#]
es que no necesita saber cuántos elementos ya hay en la matriz.