En Oracle Database, JSON_QUERY()
La función selecciona y devuelve uno o más valores de los datos JSON y devuelve esos valores.
Puede utilizar la función para recuperar fragmentos de un documento JSON.
Sintaxis
La sintaxis es así:
JSON_QUERY
( expr [ FORMAT JSON ], JSON_basic_path_expression
[ JSON_query_returning_clause ] [ JSON_query_wrapper_clause ]
[ JSON_query_on_error_clause ] [ JSON_query_on_empty_clause ]
)
Dónde:
expr
es el documento JSON que desea consultarJSON_basic_path_expression
es la ruta SQL/JSON que desea devolver desde ese documento JSON. La función usa la expresión de ruta para evaluarexpr
y encuentre uno o más valores JSON que coincidan o satisfagan la expresión de la ruta. La expresión de ruta debe ser un texto literal.JSON_query_returning_clause
especifica el tipo de datos y el formato de la cadena de caracteres devuelta por la función.JSON_query_wrapper_clause
controla si la función envuelve los valores devueltos en un contenedor de matriz (corchetes ([]
)).JSON_query_on_error_clause
especifica el valor devuelto cuando ocurren ciertos errores.JSON_query_on_empty_clause
especifica el valor devuelto si no se encuentra ninguna coincidencia cuando los datos JSON se evalúan mediante la expresión de ruta SQL/JSON.
Consulte la documentación de Oracle para obtener una explicación detallada de las cláusulas opcionales.
Ejemplo
Aquí hay un ejemplo para demostrar cómo JSON_QUERY()
la función funciona:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$')
FROM DUAL;
Resultado:
{"a":1,"b":2,"c":3}
El uso del signo de dólar por sí solo devuelve la cadena completa de datos JSON.
Con envoltorio
Puedes usar el WITH WRAPPER
cláusula para envolver el resultado en un contenedor de matriz:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH WRAPPER)
FROM DUAL;
Resultado:
[{"a":1,"b":2,"c":3}]
Debe especificar esta cláusula si la expresión de ruta coincide con un solo valor escalar (un valor que no es un objeto JSON o una matriz JSON) o varios valores de cualquier tipo.
Por ejemplo, devolver el siguiente valor escalar debe hacerse con WITH WRAPPER
cláusula:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH WRAPPER)
FROM DUAL;
Resultado:
[2]
Omitiendo el WITH WRAPPER
cuando se devuelve un valor escalar, se devuelve un valor nulo:
SET NULL 'null';
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b')
FROM DUAL;
Resultado:
null
De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que null
ocurre como resultado de un SQL SELECT
declaración.
Sin embargo, puede usar SET NULL
para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null
debe ser devuelto.
Con contenedor condicional
Alternativamente, puede usar el WITH CONDITIONAL WRAPPER
cláusula para incluir el contenedor de matriz solo si la expresión de ruta coincide con un solo valor escalar o varios valores de cualquier tipo. Si la expresión de la ruta coincide con un solo objeto JSON o una matriz JSON, se omite el envoltorio de la matriz:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH CONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH CONDITIONAL WRAPPER) AS "r2"
FROM DUAL;
Resultado:
r1 r2 ______________________ ______ {"a":1,"b":2,"c":3} [2]
En este caso, solo el valor escalar tiene aplicado el contenedor de matriz.
Para que quede claro, aquí está con un envoltorio incondicional:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH UNCONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH UNCONDITIONAL WRAPPER) AS "r2"
FROM DUAL;
Resultado:
r1 r2 ________________________ ______ [{"a":1,"b":2,"c":3}] [2]
Esta vez ambos resultados tienen aplicado el envoltorio.
Tenga en cuenta que WITH UNCONDITIONAL WRAPPER
es el equivalente de WITH WRAPPER
.
Gestión de errores
Hay cinco cláusulas que puede usar para especificar qué devolver cada vez que ocurran ciertos tipos de errores. Las cláusulas son:
NULL
ON
ERROR
– Devuelve nulo cuando se produce un error. Este es el valor predeterminado.ERROR
ON
ERROR
– Devuelve el error de Oracle apropiado cuando ocurre un error.EMPTY
ON
ERROR
– Especificar esta cláusula es equivalente a especificarEMPTY
ARRAY
ON
ERROR
.EMPTY
ARRAY
ON
ERROR
– Devuelve una matriz JSON vacía ([]
) cuando se produce un error.EMPTY
OBJECT
ON
ERROR
– Devuelve un objeto JSON vacío ({}
) cuando se produce un error.
He aquí un ejemplo:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' NULL ON ERROR) AS "r1",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON ERROR) AS "r2",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY OBJECT ON ERROR) AS "r3"
FROM DUAL;
Resultado:
r1 r2 r3 _______ _____ _____ null [] {}
Aquí está con el ERROR ON ERROR
cláusula:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' ERROR ON ERROR)
FROM DUAL;
Resultado:
Error report - ORA-40462: JSON_VALUE evaluated to no value
Estas cláusulas de error son para manejar los siguientes errores:
- El primer argumento no son datos JSON bien formados con sintaxis JSON estricta o laxa
- No se encuentra ninguna coincidencia cuando los datos JSON se evalúan mediante la expresión de ruta SQL/JSON. Puede anular el comportamiento de este tipo de error especificando
JSON_query_on_empty_clause
. - El tipo de datos del valor de retorno no es lo suficientemente grande para contener la cadena de caracteres de retorno
- La función coincide con un único valor escalar o con varios valores de cualquier tipo y no se especifica una cláusula contenedora
Manejo de resultados vacíos
También puede usar una cláusula para especificar el valor devuelto si no se encuentra ninguna coincidencia. Esta cláusula le permite especificar un resultado diferente para este tipo de error que el resultado especificado con las cláusulas de error.
Estas cláusulas son:
NULL
ON
EMPTY
– Devuelve nulo cuando no se encuentra ninguna coincidencia.ERROR
ON
EMPTY
– Devuelve el error de Oracle apropiado cuando no se encuentra ninguna coincidencia.EMPTY
ON
EMPTY
– Especificar esta cláusula es equivalente a especificarEMPTY
ARRAY
ON
EMPTY
.EMPTY
ARRAY
ON
EMPTY
– Devuelve una matriz JSON vacía ([]
) cuando no se encuentra ninguna coincidencia.EMPTY
OBJECT
ON
EMPTY
– Devuelve un objeto JSON vacío ({}
) cuando no se encuentra ninguna coincidencia.
Ejemplo:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON EMPTY)
FROM DUAL;
Resultado:
[]
Si omite esta cláusula, la cláusula de error determina el valor devuelto cuando no se encuentra ninguna coincidencia.