En MariaDB, JSON_EXISTS()
es una función integrada que le permite verificar si existe un valor en una ruta específica en el documento JSON.
Acepta el documento JSON como argumento y devuelve 1
si se encuentra la ruta, y 0
si no lo es.
La documentación de MariaDB establece que la función "determina si existe un valor JSON específico en los datos dados". Sin embargo, la función en realidad no parece verificar un valor dado. Probablemente sea más exacto decir que determina si una ruta específica existe, o que existe un valor en la ruta especificada.
Para comprobar que el valor real existe, puede usar JSON_CONTAINS()
función.
Sintaxis
La sintaxis es así:
JSON_EXISTS(json_doc, path)
Donde json_doc
es el documento JSON y path
es el camino a encontrar.
Ejemplo
Aquí hay un ejemplo para demostrarlo.
SELECT JSON_EXISTS('{ "name": "Wag" }', '$.name');
Resultado:
+--------------------------------------------+ | JSON_EXISTS('{ "name": "Wag" }', '$.name') | +--------------------------------------------+ | 1 | +--------------------------------------------+
En este caso, se encuentra la ruta y el resultado es 1
.
Si no se encuentra la ruta, el resultado es 0
, así:
SELECT JSON_EXISTS('{ "name": "Wag" }', '$.type');
Resultado:
+--------------------------------------------+ | JSON_EXISTS('{ "name": "Wag" }', '$.type') | +--------------------------------------------+ | 0 | +--------------------------------------------+
Arreglos
En este ejemplo, verifico la existencia de un elemento en un índice dado de una matriz:
SELECT JSON_EXISTS(
'{
"name": "Wag",
"scores": [ 10, 8, 7 ]
}',
"$.scores[2]"
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 1 | +--------+
Esto es lo que sucede si el índice no existe en la matriz:
SELECT JSON_EXISTS(
'{
"name": "Wag",
"scores": [ 10, 8, 7 ]
}',
'$.scores[3]'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 0 | +--------+
Documento JSON más grande
Aquí hay un ejemplo que usa un documento JSON un poco más grande. Aquí, busco una clave que existe dentro de varios niveles de anidamiento:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXISTS(
@json_document,
'$.details.awards.Sumo 2020'
) AS Result;
Resultado:
+--------+ | Result | +--------+ | 1 | +--------+
Argumentos nulos
Si alguno de los argumentos es NULL
, el resultado es NULL
:
SELECT
JSON_EXISTS(null, '$.a'),
JSON_EXISTS('{ "a": 1 }', null);
Resultado:
+--------------------------+---------------------------------+ | JSON_EXISTS(null, '$.a') | JSON_EXISTS('{ "a": 1 }', null) | +--------------------------+---------------------------------+ | NULL | NULL | +--------------------------+---------------------------------+
JSON no válido
Pasar JSON no válido da como resultado NULL
:
SELECT JSON_EXISTS('{1}', '$.a');
Resultado:
+---------------------------+ | JSON_EXISTS('{1}', '$.a') | +---------------------------+ | NULL | +---------------------------+
Recuento de parámetros incorrecto
No proporcionar argumentos da como resultado un error:
SELECT JSON_EXISTS();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXISTS'
Es lo mismo cuando proporciona demasiados argumentos:
SELECT JSON_EXISTS('{"a": 1}', '$.a', 3);
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXISTS'