No SQLite, o
json_array_length()
A função retorna o número de elementos em uma determinada matriz JSON. A matriz é fornecida como um argumento. Se a matriz estiver inserida em um documento JSON maior, podemos usar um segundo argumento opcional para especificar o caminho para a matriz.
Se o valor não for um array, a função retornará
0
. Sintaxe
A função pode ser usada das duas maneiras a seguir:
json_array_length(X)
json_array_length(X,P)
Onde
X
representa a matriz e P
é um caminho opcional que pode ser usado para especificar o caminho para a matriz em um documento maior. Exemplo
Aqui está um exemplo básico para demonstrar:
SELECT json_array_length('[ 7, 12, 10 ]');
Resultado:
3
A matriz contém três elementos e, portanto,
3
é devolvido. Especifique um caminho
Também podemos usar um segundo argumento para especificar o caminho para o array:
SELECT json_array_length('[ 7, 12, 10 ]', '$');
Resultado:
3
Nesse caso, o array está no nível superior e, portanto, passamos
$
como o caminho. O exemplo a seguir usa uma matriz incorporada em um documento maior:
SELECT json_array_length('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs'
);
Resultado:
3
Neste caso, o array em
dogs
contém três elementos. Podemos navegar para o próximo nível e encontrar o número de elementos em uma das outras matrizes:
SELECT json_array_length('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].scores'
);
Resultado:
4
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. Em seguida, usamos .scores
para selecionar sua matriz. Seleção de não matrizes
Se o caminho apontar para um valor diferente de uma matriz JSON,
0
é retornado:SELECT json_array_length('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].name'
);
Resultado:
0
Selecionando um caminho inexistente
Se o segundo argumento apontar para um caminho que não existe,
null
é devolvido. Primeiro, vamos definir
.nullvalue
para NULL
:.nullvalue NULL
O
.nullvalue
O comando dot nos permite fornecer uma string que será usada para substituir valores nulos. É uma das várias maneiras de substituir valores nulos por uma string no SQLite. Neste caso, defini-lo como NULL
. Agora, qualquer valor nulo retornará NULL
em vez de um resultado em branco. Agora vamos chamar
json_array_length()
, mas use um segundo argumento que aponta para um caminho inexistente:SELECT json_array_length('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.cats'
);
Resultado:
NULL
Caminhos inválidos
Receberemos um erro se nosso caminho não estiver bem formado:
SELECT json_array_length('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'dogs'
);
Resultado:
Runtime error: JSON path error near 'dogs'
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_array_length('{ "Dogs" : }',
'$'
);
Resultado:
Runtime error: malformed JSON
Desta vez, o erro nos diz que nosso JSON está malformado.