No MariaDB,
JSON_LENGTH()
é uma função interna que retorna o comprimento de um documento JSON. Ao chamar essa função, você fornece o documento JSON como argumento. Você também pode fornecer um argumento de caminho para retornar o comprimento de um valor dentro do documento.
O comprimento é determinado da seguinte forma:
- O comprimento de um escalar é sempre 1.
- Se for uma matriz, o número de elementos na matriz.
- Se for um objeto, o número de membros no objeto.
O comprimento de matrizes ou objetos aninhados não são contados.
Sintaxe
A sintaxe fica assim:
JSON_LENGTH(json_doc[, path])
Onde
json_doc
é o documento JSON e path
é um argumento opcional que especifica um caminho dentro do documento. Exemplo
Aqui está um exemplo para demonstrar.
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_LENGTH(@json_document);
Resultado:
+-----------------------------+ | JSON_LENGTH(@json_document) | +-----------------------------+ | 3 | +-----------------------------+
Especificando um caminho
Aqui está um exemplo de especificação de um caminho dentro do documento:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_LENGTH(@json_document, '$.details');
Resultado:
+------------------------------------------+ | JSON_LENGTH(@json_document, '$.details') | +------------------------------------------+ | 2 | +------------------------------------------+
Como mencionado, ele não conta o comprimento de objetos aninhados, então obtemos um resultado de
2
. O próximo exemplo desce um nível e conta a duração dos
awards
objeto:SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_LENGTH(@json_document, '$.details.awards');
Resultado:
+-------------------------------------------------+ | JSON_LENGTH(@json_document, '$.details.awards') | +-------------------------------------------------+ | 3 | +-------------------------------------------------+
Escalares
O comprimento de um escalar é sempre
1
:SELECT JSON_LENGTH(
'{ "a" : 378, "b" : 45 }',
'$.a'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 1 | +--------+
Matrizes
Se o documento for um array,
JSON_LENGTH()
conta o número de elementos no array:SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"scores": [9, 7, 8, 10, 3]
}
';
SELECT JSON_LENGTH(@json_document, '$.scores');
Resultado:
+-----------------------------------------+ | JSON_LENGTH(@json_document, '$.scores') | +-----------------------------------------+ | 5 | +-----------------------------------------+
Caminhos inexistentes
Passar um caminho que não existe no documento JSON resulta em
NULL
. Exemplo:
SET @json_document = '
{
"name": "Wag",
"type": "Dog"
}
';
SELECT JSON_LENGTH(@json_document, '$.oops');
Resultado:
+---------------------------------------+ | JSON_LENGTH(@json_document, '$.oops') | +---------------------------------------+ | NULL | +---------------------------------------+
Objetos Vazios
Se o objeto selecionado estiver vazio, o resultado será
0
:SELECT JSON_LENGTH('{}');
Resultado:
+-------------------+ | JSON_LENGTH('{}') | +-------------------+ | 0 | +-------------------+
Argumentos nulos
Se algum argumento for
NULL
, o resultado é NULL
:SELECT
JSON_LENGTH(null) AS a,
JSON_LENGTH(null, '$.type') AS b,
JSON_LENGTH('{"a":1}', null) AS c;
Resultado:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Contagem de parâmetros incorreta
Não fornecer argumentos resulta em um erro:
SELECT JSON_LENGTH();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_LENGTH'