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

SQLite JSON_INSERT()


O SQLite json_insert() A função nos permite inserir um novo valor em um documento JSON.

Passamos o JSON original como o primeiro argumento quando chamamos a função, seguido de um caminho que especifica onde inserir o novo valor, seguido do valor a ser inserido.

Também podemos inserir vários pares de chave/valor, se necessário.

Sintaxe


A função é chamada assim:
json_extract(json, path1, value1, path2, value2...)

Onde json representa o JSON original e path1, value1, path2, value2... são pares de caminho/valor que podemos usar para inserir novos valores no documento JSON.

Exemplo


Aqui está um exemplo básico para demonstrar:
SELECT json_insert('{ "a" : 1 }', '$.b', 2);

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

Aqui, inseri um novo par chave/valor ("b":2 ) no documento JSON.

Podemos inserir vários pares de chave/valor como este:
SELECT json_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );

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

Eu simplesmente adicionei mais argumentos de chave/valor quando chamei json_insert() .

A chave/valor já existe?


O json_insert() a função não inserirá o valor se a chave já existir:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);

Resultado:
{"a":1}

Neste caso, a chave a já existe no JSON e, portanto, tentar inserir um novo valor para essa chave não funciona.

Para substituir um valor, use json_replace() ou json_set() .

Inserir um objeto


Aqui está um exemplo de inserção de outro documento JSON:
SELECT json_insert('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );

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

Nesse caso, usei o json() função para retornar meu argumento como uma string JSON. Aqui está o que acontece quando eu não faço isso:
SELECT json_insert('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );

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

O documento JSON é inserido como um valor de texto em vez de um objeto JSON e, portanto, suas aspas duplas são escapadas com barras invertidas.

Isso é justo o suficiente. Afinal, colocamos o novo valor entre aspas simples. Como o SQLite saberia se queríamos inserir uma string ou um objeto JSON?

E não é como se pudéssemos simplesmente remover essas aspas simples:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );

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

Sem aspas simples ou o json() função, obtemos um erro assim que encontra a chave esquerda.

Outra maneira de inserir um objeto JSON é usar o json_object() função em vez do json() função:
SELECT json_insert('{ "a" : 1 }', '$.b', json_object('c', 2) );

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

Inserir uma matriz


É algo semelhante ao inserir matrizes:
SELECT json_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));

Resultado:
{"a":1,"b":[2,3,4]}

Se removermos o json() função, obtemos isso:
SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');

Resultado:
{"a":1,"b":"[ 2, 3, 4 ]"}

E se removermos as aspas simples, obtemos um erro:
SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);

Resultado:
Parse error: no such column:  2, 3, 4 
  SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
                             error here ---^

Alternativamente, podemos usar o json_array() função em vez de json() . Essa função permite que você crie uma matriz com base em seus argumentos:
SELECT json_insert('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );

Resultado:
{"a":1,"b":[2,3,4]}

Anexar valores ao final de uma matriz


Podemos usar json_insert() para acrescentar valores ao final de uma matriz.

Para fazer isso, use um índice de matriz de [#] :
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );

Resultado:
[1,2,3,4]

O mesmo princípio se aplica a matrizes aninhadas:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );

Resultado:
[1,["a","b","c"],3]

Caminhos inválidos


Receberemos um erro se nosso caminho não estiver bem formado:
SELECT json_insert('{ "a" : 1 }', 'b', 2);

Resultado:
Runtime error: JSON path error near 'b'

Nesse caso, esqueci de incluir $. na frente do caminho.

Documentos JSON inválidos


Também receberemos um erro de que o JSON não está bem formado:
SELECT json_insert('{ "a" : 1', '$.b', 2);

Resultado:
Runtime error: malformed JSON

Desta vez, o erro nos diz que nosso JSON está malformado.