No SQLite, o
->> O operador extrai um subcomponente de um documento JSON e retorna uma representação SQL desse subcomponente. O
->> O operador foi introduzido pela primeira vez no SQLite versão 3.38.0 (lançado em 22 de fevereiro de 2022). Sintaxe
A sintaxe fica assim:
json ->> path Onde
json é o documento JSON e o path é o caminho para o subcomponente que queremos extrair dele. Portanto, fornecemos um documento JSON à esquerda do operador e especificamos o caminho que queremos extrair à direita.
O
->> O operador sempre retorna uma representação SQL do subcomponente especificado. Para retornar uma representação JSON, use o -> operador em vez disso. Exemplos
Aqui está um exemplo simples para demonstrar como o
->> operador funciona:SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$'; Resultado:
{"name":"Wag","type":"Dog"} Nesse caso, especifiquei um caminho de
'$' que retorna o documento inteiro. Vamos especificar outro caminho:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type'; Resultado:
Dog
Também podemos omitir o cifrão e o ponto final, assim:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type'; Resultado:
Dog
Aqui está com um documento JSON maior:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0]'; Resultado:
{"user":"Spike","age":30,"scores":[9,7,3]} No SQLite, as matrizes são baseadas em zero e, portanto, especificando
[0] retorna o primeiro elemento da matriz. Se quiséssemos apenas obter as pontuações desse usuário, poderíamos fazer isso:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores'; Resultado:
[9,7,3]
Podemos ir ainda mais fundo e extrair uma pontuação específica:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores[1]'; Resultado:
7
Caminho inexistente
Se o caminho não existir no JSON, um valor nulo será retornado:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age'; Resultado:
null
Observe que no SQLite, você pode usar
.nullvalue para especificar uma string para saída sempre que um valor nulo for retornado. No meu caso, eu já havia executado o seguinte comando:.nullvalue null Isso especifica que o texto
null deve ser gerado sempre que um valor nulo é retornado. É por isso que o exemplo acima gera o texto null . Se eu não tivesse feito isso, o resultado poderia ter sido em branco. JSON inválido
Se o primeiro argumento não for um JSON válido, um erro será gerado:
SELECT '{ "name" }' ->> '$'; Resultado:
Runtime error: malformed JSON
Caminho inválido
E se o segundo argumento não for um caminho válido, um erro será lançado:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name'; Resultado:
Runtime error: JSON path error near 'name'
Nesse caso, esqueci de incluir o ponto final (
. ) entre o cifrão ($ ) e name . No entanto, como mencionado, é possível omitir o cifrão e o ponto final:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name'; Resultado:
Wag