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 quejson_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 quejson_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.