SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

JSON_INSERT() vs JSON_SET() vs JSON_REPLACE() no SQLite


O SQLite fornece várias funções para inserir, definir e substituir valores em um documento JSON. Especificamente, ele fornece json_insert() , json_set() e json_replace() .

Essas funções executam tarefas semelhantes e, às vezes, você pode usá-las de forma intercambiável até certo ponto.

Mas há definitivamente uma diferença clara entre cada função.

A diferença


A tabela a seguir descreve a diferença entre essas funções:
Função Substituir se já existir? Criar se não existir?
json_insert() Não Sim
json_replace() Sim Não
json_set() Sim Sim

Portanto, a diferença entre essas funções está em como elas lidam com chaves/valores existentes e inexistentes.

Exemplos


Aqui estão alguns exemplos simples para demonstrar como cada função lida com chaves/valores existentes e inexistentes.

Quando a chave já existe


Veja como cada função lida com a atualização de uma chave que já 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() não atualizou nada, mas as outras duas funções sim.

É algo semelhante com arrays:
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] |+-------------+--------------+----------+ 

Quando a chave não existe


Veja o que acontece quando a chave não 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() não inseriu o novo par chave/valor, mas as outras duas funções sim.

Mesma coisa com arrays:
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] |+-------------+------------------+---------- -+

Isso também pode ser feito usando o [#] caminho:
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] |+-------------+------------------+---------- -+

Um benefício de usar [#] é que você não precisa saber quantos elementos já estão no array.