No MariaDB,
JSON_CONTAINS_PATH()
é uma função interna que indica se um determinado documento JSON contém dados no caminho ou caminhos especificados. Ele retorna
1
se o documento contiver dados no(s) caminho(s) especificado(s), 0
se não, e NULL
se algum dos argumentos for NULL
. Sintaxe
A sintaxe fica assim:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
Onde
json_doc
é o documento JSON e o path
especifica o caminho para o qual localizar dados. Vários caminhos podem ser fornecidos. O
return_arg
argumento determina como lidar com vários caminhos. Pode ser one
ou all
. one
– A função retorna1
se existir pelo menos um caminho no documento JSON.all
– A função retorna1
somente se todos os caminhos existirem no documento JSON.
Exemplo
Aqui está um exemplo para demonstrar.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name');
Resultado:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.name') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
Nesse caso, o caminho existe e o resultado é
1
. No próximo exemplo, o caminho não existe e o resultado é
0
:SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type');
Resultado:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.type') | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+
Vários caminhos
Aqui estão alguns exemplos que pesquisam vários caminhos dentro do documento:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.type',
'$.weight'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 1 | +--------+
Neste exemplo, procuramos dois caminhos. Um caminho existe e o outro não. Mas temos um
1
de qualquer maneira (um resultado positivo). Isso ocorre porque usamos one
como segundo argumento. O one
especifica que obteremos um 1
se algum dos caminhos existir. Veja o que acontece se usarmos
all
como segundo argumento:SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.type',
'$.weight'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 0 | +--------+
Desta vez o resultado é
0
, porque nem todos os caminhos existem no documento JSON. Se alterarmos o caminho ausente (
$.type
) para um que existe, obtemos um resultado diferente:SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.name',
'$.weight'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 1 | +--------+
Matrizes
Aqui está um exemplo que testa se um determinado índice existe dentro de uma matriz:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[2]'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 1 | +--------+
E aqui está o que acontece se aumentarmos o índice para um inexistente:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[3]'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 0 | +--------+
Estruturas aninhadas
Aqui está um exemplo que procura um caminho dentro de um documento aninhado:
SET @json_document = '
{
"name": "Wag",
"specs": {
"weight": 10,
"height": 30
}
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.specs.height'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 1 | +--------+
Argumentos nulos
Se algum argumento for
NULL
, o resultado é NULL
:SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT
JSON_CONTAINS_PATH(null, 'one', '$.weight') AS a,
JSON_CONTAINS_PATH(@json_document, null, '$.weight') AS b,
JSON_CONTAINS_PATH(@json_document, 'one', 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_CONTAINS_PATH();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'
A mesma coisa acontece quando você não passa argumentos suficientes:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document);
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'