Dans Oracle Database, le JSON_TABLE() La fonction crée une vue relationnelle des données JSON. Il vous permet de présenter les valeurs d'un document JSON sous forme de tableau - sous forme de lignes et de colonnes.
Syntaxe
La syntaxe ressemble à ceci :
JSON_TABLE
( expr [ FORMAT JSON ] [ , JSON_basic_path_expression ]
[ JSON_table_on_error_clause ] [ JSON_table_on_empty_clause ]
JSON_columns_clause ) Où :
exprest le document JSON que vous souhaitez interrogerJSON_basic_path_expressionest l'expression de chemin SQL/JSON.JSON_query_on_error_clausespécifie la valeur renvoyée lorsque certaines erreurs se produisent.JSON_query_on_empty_clausespécifie la valeur renvoyée si aucune correspondance n'est trouvée.JSON_columns_clausedéfinit les colonnes de la table relationnelle virtuelle renvoyée par la fonction.
Le JSON_TABLE() la fonction ne peut être utilisée que dans le FROM clause d'un SELECT déclaration.
Exemple
Voici un exemple pour illustrer son fonctionnement :
SELECT *
FROM JSON_TABLE('{a:1, b:2, c:3}', '$' COLUMNS(a, b, c)); Résultat :
A B C ____ ____ ____ 1 2 3
La voici avec un peu plus de données :
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)
); Résultat :
A B C ____ ____ ____ 1 2 3 4 5 6 7 8 9
Moins de colonnes
Voici ce qui se passe si nous réduisons le nombre de colonnes spécifiées dans le COLUMNS clause :
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)
); Résultat :
A B ____ ____ 1 2 4 5 7 8
Nous pouvons obtenir le même résultat en spécifiant les colonnes sélectionnées dans le SELECT liste :
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)
); Résultat :
A B ____ ____ 1 2 4 5 7 8
Sélectionner des lignes spécifiques
Nous pouvons utiliser des clauses comme WHERE pour ne sélectionner que les lignes qui satisfont à certains critères :
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; Résultat :
A B C ____ ____ ____ 4 5 6
Gestion des erreurs
Nous pouvons utiliser les clauses suivantes pour traiter les erreurs :
NULL ON ERROR- Si l'entrée n'est pas un JSON bien formé, aucune autre ligne n'est renvoyée à partir du moment où l'erreur est détectée.
- Si aucune correspondance n'est trouvée lors de l'évaluation de l'expression de chemin de ligne, aucune ligne n'est renvoyée.
- Définit le comportement d'erreur par défaut pour toutes les expressions de colonne sur
NULL ON ERROR
ERROR ON ERROR- Si l'entrée n'est pas un JSON bien formé, une erreur est générée.
- Si aucune correspondance n'est trouvée lors de l'évaluation de l'expression de chemin de ligne, une erreur sera générée
- Définit le comportement d'erreur par défaut pour toutes les expressions de colonne sur
ERROR ON ERROR
Voici un exemple 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)
); Résultat :
A B C ____ ____ ____ 1 2 3 4 5 6
Depuis le JSON_TABLE() prend en charge l'évaluation en continu, les lignes peuvent être renvoyées avant de rencontrer la partie de l'entrée avec l'erreur. C'est exactement ce que nous pouvons voir avec cet exemple - nous avons les deux premières lignes, mais pas la troisième (car cette partie du JSON n'est pas bien formée).
Le voici avec le ERROR ON ERROR clause :
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)
); Résultat :
Error report - ORA-40441: JSON syntax error
Gestion des résultats vides
Vous pouvez également utiliser une clause pour spécifier la valeur renvoyée si aucune correspondance n'est trouvée. Cette clause vous permet de spécifier un résultat différent pour ce type d'erreur que le résultat spécifié avec les clauses d'erreur.
Ces clauses sont :
NULLONEMPTY– Renvoie null lorsqu'aucune correspondance n'est trouvée.ERRORONEMPTY– Renvoie l'erreur Oracle appropriée lorsqu'aucune correspondance n'est trouvée.DEFAULTliteralONEMPTY– Renvoieliterallorsqu'aucune correspondance n'est trouvée. Le type de données deliteraldoit correspondre au type de données de la valeur renvoyée par cette fonction.
Voir la documentation Oracle pour plus d'informations sur le JSON_TABLE() fonction.