Oracle
 sql >> Database >  >> RDS >> Oracle

JSON_TABLE() Funzione in Oracle

In Oracle Database, il JSON_TABLE() La funzione crea una vista relazionale dei dati JSON. Ti consente di presentare i valori in un documento JSON in formato tabella, come righe e colonne.

Sintassi

La sintassi è questa:

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

Dove:

  • expr è il documento JSON che vuoi interrogare
  • JSON_basic_path_expression è l'espressione del percorso SQL/JSON.
  • JSON_query_on_error_clause specifica il valore restituito quando si verificano determinati errori.
  • JSON_query_on_empty_clause specifica il valore restituito se non viene trovata alcuna corrispondenza.
  • JSON_columns_clause definisce le colonne nella tabella relazionale virtuale restituita dalla funzione.

Il JSON_TABLE() la funzione può essere utilizzata solo nel FROM clausola di un SELECT dichiarazione.

Esempio

Ecco un esempio per dimostrare come funziona:

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

Risultato:

   A    B    C 
____ ____ ____ 
1    2    3    

Eccolo con un po' più di dati:

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)
    );

Risultato:

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

Meno colonne

Ecco cosa succede se riduciamo il numero di colonne specificate in COLUMNS clausola:

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)
    );

Risultato:

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Possiamo ottenere lo stesso risultato specificando le colonne selezionate in SELECT elenco:

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)
    );

Risultato:

   A    B 
____ ____ 
1    2    
4    5    
7    8    

Seleziona righe specifiche

Possiamo usare clausole come WHERE per selezionare solo quelle righe che soddisfano determinati criteri:

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;

Risultato:

   A    B    C 
____ ____ ____ 
4    5    6    

Gestione degli errori

Possiamo utilizzare le seguenti clausole per gestire gli errori:

  • NULL ON ERROR
    • Se l'input non è JSON ben formato, non vengono restituite più righe dal punto in cui viene rilevato l'errore.
    • Se non viene trovata alcuna corrispondenza quando viene valutata l'espressione del percorso di riga, non vengono restituite righe.
    • Imposta il comportamento di errore predefinito per tutte le espressioni di colonna su NULL ON ERROR
  • ERROR ON ERROR
    • Se l'input non è JSON ben formato, viene generato un errore.
    • Se non viene trovata alcuna corrispondenza quando viene valutata l'espressione del percorso di riga, verrà generato un errore
    • Imposta il comportamento di errore predefinito per tutte le espressioni di colonna su ERROR ON ERROR

Ecco un esempio di 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)
    );

Risultato:

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

Dal momento che JSON_TABLE() la funzione supporta la valutazione del flusso, le righe possono essere restituite prima di incontrare la parte dell'input con l'errore. Questo è esattamente ciò che possiamo vedere con questo esempio:abbiamo ottenuto le prime due righe, ma non la terza (perché quella parte del JSON non è JSON ben formato).

Eccolo con ERROR ON ERROR clausola:

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)
    );

Risultato:

Error report -
ORA-40441: JSON syntax error

Gestione dei risultati vuoti

È inoltre possibile utilizzare una clausola per specificare il valore restituito se non viene trovata alcuna corrispondenza. Questa clausola consente di specificare un esito diverso per questo tipo di errore rispetto all'esito specificato con le clausole di errore.

Queste clausole sono:

  • NULL ON EMPTY – Restituisce null quando non viene trovata alcuna corrispondenza.
  • ERROR ON EMPTY – Restituisce l'errore Oracle appropriato quando non viene trovata alcuna corrispondenza.
  • DEFAULT literal ON EMPTY – Restituisce literal quando non viene trovata alcuna corrispondenza. Il tipo di dati di literal deve corrispondere al tipo di dati del valore restituito da questa funzione.

Consulta la documentazione di Oracle per ulteriori informazioni su JSON_TABLE() funzione.