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

3 maneiras de extrair um valor de um documento JSON no SQLite


Ao usar o SQLite, podemos usar os seguintes métodos para extrair dados de um documento JSON.

O json_extract() Função


Como o próprio nome sugere, o json_extract() A função extrai e retorna um ou mais valores de JSON bem formado.

Exemplo:
SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Resultado:
{"name":"Bark","scores":[3,4,8,7]}

As matrizes são baseadas em zero e, portanto, a contagem começa em 0 . Portanto, especificamos [1] para obter o segundo elemento dentro do dogs array, que por acaso é um objeto JSON.

Podemos retornar apenas o nome do cachorro naquela posição no array adicionando ao nosso caminho:
SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Resultado:
Bark

Podemos usar json_extract() para retornar vários caminhos:
SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);

Resultado:
["Wag","Bark","Woof"]

Quando extraímos valores de vários caminhos, os valores são retornados em uma matriz.

O -> Operador


O -> O operador extrai um subcomponente de um documento JSON e retorna uma representação JSON desse subcomponente.

Portanto, podemos alterar o primeiro exemplo para isso:
SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1]';

Resultado:
{"name":"Bark","scores":[3,4,8,7]}

O -> operador é sutilmente diferente do json_extract() função:
  • O -> O operador sempre retorna uma representação JSON do subcomponente.
  • O json_extract() A função só retorna JSON se houver dois ou mais argumentos de caminho (porque o resultado é então uma matriz JSON) ou se o argumento de caminho único fizer referência a uma matriz ou objeto.
  • Se houver apenas um argumento de caminho e esse caminho fizer referência a um JSON nulo ou uma string ou um valor numérico, json_extract() retorna o valor SQL NULL, TEXT, INTEGER ou REAL correspondente.

Portanto, veja o que acontece quando extraímos o nome de um cachorro do nosso JSON:
SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1].name';

Resultado:
"Bark"

Desta vez, está cercado por aspas. Isso porque retornou uma representação JSON do valor. Quando extraímos o mesmo valor com json_extract() anteriormente, obtemos uma representação SQL do valor.

No entanto, também podemos usar o ->> operador para retornar uma representação SQL.

O ->> Operador


O ->> O operador funciona da mesma forma que o -> operador, exceto que ->> retorna uma representação SQL do subcomponente especificado. Especificamente, ele retorna um SQL TEXT , INTEGER , REAL , ou NULL valor que representa o subcomponente selecionado, ou NULL se o subcomponente não existir.

Portanto, aqui está o que acontece quando usamos o ->> operador para extrair o nome do cachorro:
SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' ->> '$.dogs[1].name';

Resultado:
Bark

Não está mais entre aspas.