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 interrogareJSON_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
– Restituisceliteral
quando non viene trovata alcuna corrispondenza. Il tipo di dati diliteral
deve corrispondere al tipo di dati del valore restituito da questa funzione.
Consulta la documentazione di Oracle per ulteriori informazioni su JSON_TABLE()
funzione.