sql >> Base de Datos >  >> RDS >> Oracle

Función JSON_TABLE() en Oracle

En Oracle Database, JSON_TABLE() La función crea una vista relacional de los datos JSON. Le permite presentar los valores en un documento JSON en formato de tabla, como filas y columnas.

Sintaxis

La sintaxis es así:

JSON_TABLE
  ( expr [ FORMAT JSON ] [ , JSON_basic_path_expression ]
    [ JSON_table_on_error_clause ] [ JSON_table_on_empty_clause ] 
    JSON_columns_clause )

Dónde:

  • expr es el documento JSON que desea consultar
  • JSON_basic_path_expression es la expresión de ruta de SQL/JSON.
  • 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.
  • JSON_columns_clause define las columnas en la tabla relacional virtual devuelta por la función.

El JSON_TABLE() La función solo se puede usar en FROM cláusula de un SELECT declaración.

Ejemplo

Aquí hay un ejemplo para demostrar cómo funciona:

SELECT *
FROM JSON_TABLE('{a:1, b:2, c:3}', '$' COLUMNS(a, b, c));

Resultado:

   A    B    C 
____ ____ ____ 
1    2    3    

Aquí está con un poco más de datos:

SELECT *
FROM JSON_TABLE(
    '[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]', 
    '$[*]' 
    COLUMNS(a, b, c)
    );

Resultado:

   A    B    C 
____ ____ ____ 
1    2    3    
4    5    6    
7    8    9   

Menos columnas

Esto es lo que sucede si reducimos el número de columnas especificadas en COLUMNS cláusula:

SELECT *
FROM JSON_TABLE(
    '[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]', 
    '$[*]' 
    COLUMNS(a, b)
    );

Resultado:

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Podemos lograr el mismo resultado especificando columnas seleccionadas en SELECT lista:

SELECT a, b
FROM JSON_TABLE(
    '[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]', 
    '$[*]' 
    COLUMNS(a, b, c)
    );

Resultado:

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Seleccionar filas específicas

Podemos usar cláusulas como WHERE para seleccionar solo aquellas filas que cumplan con ciertos criterios:

SELECT *
FROM JSON_TABLE(
    '[{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]', 
    '$[*]' 
    COLUMNS(a, b, c)
    )
WHERE b = 5;

Resultado:

   A    B    C 
____ ____ ____ 
4    5    6    

Gestión de errores

Podemos usar las siguientes cláusulas para tratar los errores:

  • NULL ON ERROR
    • Si la entrada no tiene el formato JSON correcto, no se devuelven más filas desde el punto en el que se detectó el error.
    • Si no se encuentra ninguna coincidencia cuando se evalúa la expresión de ruta de fila, no se devuelve ninguna fila.
    • Establece el comportamiento de error predeterminado para todas las expresiones de columna en NULL ON ERROR
  • ERROR ON ERROR
    • Si la entrada no tiene el formato JSON correcto, se generará un error.
    • Si no se encuentra ninguna coincidencia cuando se evalúa la expresión de ruta de fila, se generará un error
    • Establece el comportamiento de error predeterminado para todas las expresiones de columna en ERROR ON ERROR

Aquí hay un ejemplo de NULL ON ERROR :

SELECT *
FROM JSON_TABLE(
    '[{a:1, b:2, c:3}, {a:4, b:5, c:6}, a:7, b:8, c:9]', 
    '$[*]'
    NULL ON ERROR
    COLUMNS(a, b, c)
    );

Resultado:

   A    B    C 
____ ____ ____ 
1    2    3    
4    5    6    

Desde el JSON_TABLE() La función admite la evaluación de transmisión, las filas se pueden devolver antes de encontrar la parte de la entrada con el error. Eso es exactamente lo que podemos ver con este ejemplo:obtuvimos las dos primeras filas, pero no la tercera (debido a que esa parte del JSON no está bien formada).

Aquí está con el ERROR ON ERROR cláusula:

SELECT *
FROM JSON_TABLE(
    '[{a:1, b:2, c:3}, {a:4, b:5, c:6}, a:7, b:8, c:9]', 
    '$[*]'
    ERROR ON ERROR
    COLUMNS(a, b, c)
    );

Resultado:

Error report -
ORA-40441: JSON syntax error

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.
  • DEFAULT literal ON EMPTY – Devuelve literal cuando no se encuentra ninguna coincidencia. El tipo de datos de literal debe coincidir con el tipo de datos del valor devuelto por esta función.

Consulte la documentación de Oracle para obtener más información sobre JSON_TABLE() función.