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

JSON_INSERT() frente a JSON_SET() frente a JSON_REPLACE() en SQLite

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
json_replace() No
json_set()

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.