A partir do SQLite versão 3.38.0 (lançado em 22 de fevereiro de 2022), agora podemos usar o
->
e ->>
operadores para extrair subcomponentes de documentos JSON. O objetivo com esses operadores é ser compatível com os operadores MySQL e PostgreSQL equivalentes.
Além disso, a partir do SQLite 3.38.0, as funções JSON agora são integradas. Portanto, não é mais necessário usar o
-DSQLITE_ENABLE_JSON1
opção de tempo de compilação para habilitar o suporte a JSON. Sintaxe
A forma como esses operadores funcionam é assim:
json -> path
json ->> path
Onde
json
é o documento JSON e o path
é o caminho que queremos extrair dele. Portanto, fornecemos um documento JSON à esquerda do operador e especificamos o caminho que queremos extrair à direita.
A diferença entre esses operadores é assim:
- O
->
operador sempre retorna uma representação JSON do subcomponente especificado - O
->>
operador sempre retorna uma representação SQL do subcomponente especificado
Exemplo do ->
Operador
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 fazer assim:
SELECT '{ "name" : "Wag", "type" : "Dog" }' -> 'type';
Resultado:
"Dog"
Exemplo do ->>
Operador
Veja o que acontece quando usamos
->>
em vez de:SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
Resultado:
Dog
O valor não é cotado como era antes. Isso porque
->
retorna uma representação JSON do subcomponente e ->>
retorna uma representação SQL. O
->>
O operador retorna um valor SQL TEXT, INTEGER, REAL ou NULL que representa o subcomponente selecionado ou NULL se o subcomponente não existir. Aqui está um exemplo com uma matriz:
SELECT '{ "scores" : [ 9, 7, 5 ] }' ->> '$.scores[2]';
Resultado:
5
Se o valor consiste apenas em um array, podemos fazer isso:
SELECT '[ 9, 7, 5 ]' ->> '2';
Resultado:
5
Isso retorna o elemento da matriz no índice especificado (neste caso 2).
Arrays são baseados em zero (a contagem começa em
0
), e é por isso que 2
retorna o terceiro item.