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

SQLiteJSON_REPLACE()

El json_replace() de SQLite La función nos permite reemplazar un valor existente en un documento JSON con otro valor.

Pasamos el JSON original como primer argumento cuando llamamos a la función, seguido de la ruta del valor a reemplazar, seguido del valor a reemplazar.

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

Sintaxis

Funciona así:

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

donde json representa el JSON original y path1, value1, path2, value2... son pares de ruta/valor para reemplazar.

Ejemplo

Aquí hay un ejemplo básico para demostrarlo:

SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");

Resultado:

{"name":"Baldy"}

Aquí, actualicé el valor de name llave de Fluffy a Baldy .

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

SELECT json_replace('{ 
    "name" : "Fluffy", 
    "age" : 10
    }', 
    '$.name', "Baldy", 
    '$.age', 11 
    );

Resultado:

{"name":"Baldy","age":11}

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

Aquí, usé saltos de línea para que el código sea más fácil de leer. Podría haber estado todo en una sola línea; el resultado habría sido el mismo.

¿Qué sucede si la clave no existe?

Si la clave aún no existe en el JSON, no se reemplaza nada:

SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);

Resultado:

{"name":"Fluffy"}

Esta es la característica principal que distingue al json_replace() función del json_set() y json_insert() funciones Esas funciones insertarán el valor si la clave aún no existe.

Sin embargo, es posible insertar efectivamente nuevas claves con json_replace() reemplazando todo el objeto/documento JSON. Ejemplo a continuación.

Reemplazar todo el documento JSON

Podemos usar json_replace() para reemplazar todo el documento JSON con otro:

SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );

Resultado:

{"name":"Baldy"}

Entonces esto nos permite insertar efectivamente nuevas claves en el documento:

SELECT json_replace('{ 
    "name" : "Fluffy" 
    }', 
    '$', 
    json('{ 
        "name" : "Baldy" ,
        "age" : 11
        }'
    ) 
);

Resultado:

{"name":"Baldy","age":11}

Estrictamente hablando, no insertamos ninguna clave nueva. Simplemente reemplazamos todo el documento. Pero el resultado fue un documento JSON que contiene claves que el original no contenía.

Reemplazar un objeto incrustado

También podemos reemplazar objetos incrustados:

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

Resultado:

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

Cuando hice esto, usé json() función para devolver mi argumento como una cadena JSON. Esto es lo que sucede cuando no hago eso:

SELECT json_replace('
    { 
        "a" : 1, 
        "b" : { "c" : 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, no podemos simplemente eliminar las comillas simples, porque esto da como resultado un error:

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

Resultado:

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

Sin comillas simples o json() función, obtenemos un error tan pronto como se encuentra con la llave izquierda. Por lo tanto, necesitamos usar comillas simples o json() dependiendo de si estamos insertando un objeto JSON o un valor de cadena/texto SQL.

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

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

Resultado:

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

Reemplazar una matriz

El mismo concepto se aplica con matrices:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));

Resultado:

{"a":[5,6,7]}

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

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');

Resultado:

{"a":"[ 5, 6, 7 ]"}

Y si eliminamos las comillas simples, obtenemos un error:

SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);

Resultado:

Parse error: no such column:  5, 6, 7  (17)
  LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
                                      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_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));

Resultado:

{"a":[5,6,7]}

Agregar valores al final de una matriz

Para agregar valores al final de una matriz, podemos usar json_insert() o json_set() funciones

Sin embargo, si debemos usar json_replace() , podemos reemplazar toda la matriz con otra que tenga los valores adicionales agregados al final de la matriz:

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

Resultado:

[1,2,3,4]

Pero como se mencionó, json_insert() y json_set() le permite agregar valores a la matriz sin reemplazar toda la matriz.

Reemplazar elementos de matriz

Aquí hay un ejemplo del uso de json_replace() para reemplazar un elemento dentro de una matriz:

SELECT json_replace('[ 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_set() La función también se puede utilizar para reemplazar elementos existentes. Sin embargo, el json_insert() La función no nos permite reemplazar elementos existentes.

Rutas no válidas

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

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

Resultado:

Runtime error: JSON path error near 'a'

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_replace('{ "a" : 1', '$.a', 2);

Resultado:

Runtime error: malformed JSON

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